01AH01144:数式が表示されない
appw.jpの数式を含む過去記事を開いたところ、数式部分が表示されない。Apacheのエラーログには次の警告が出ていた。
Apacheが/mathsvgへのリクエストをhttp://のバックエンド(Node.js製のmathsvgサーバー)へ転送しようとしたものの、
HTTP転送を担うモジュールが読み込まれていないため転送できなかった、という内容だった。
原因:③で有効化したモジュールの抜け
③Apache2で有効化したのはproxyとproxy_wstunnel(WebSocket用)までで、通常のHTTP転送を担うproxy_httpが抜けていた。
RAGシステムやMNISTのWebSocketサーバーはwss://への転送なので問題なく動いており、HTTPで転送しているmathsvgだけが失敗していた。
移設直後の全体確認では、この数式表示までは確かめきれていなかった。
| 転送先の形式 | 必要なモジュール | 該当サービス |
|---|---|---|
wss:// / ws:// | proxy_wstunnel | RAG、MNISTのWebSocketサーバー |
http:// | proxy_http | mathsvg |
02続けて出たDEP0176警告
mathsvgが動き出すと、今度はNode.jsの非推奨警告がログに出るようになった。
エラーではなく、処理自体は動いている。fs.F_OKという古い定数の書き方が非推奨になったという通知で、Node.js 24から実行時に表示されるようになった。
ただ⑰のtfjs-nodeでは、非推奨だったAPI(util.isNullOrUndefined)がNode.js側で削除されて突然動かなくなった経験がある。今のうちに出どころを突き止めることにした。
出どころを依存関係から辿る
自分のコードではfs.F_OKを使っていなかったため、node_modules内を検索した。
pnはNode.js標準ライブラリをPromise対応に包み直す古い補助ライブラリで、fsの中身を一括でコピーする作りのため、
fs.F_OKを実際に使っていなくても触れた時点で警告が出る。持ち込んでいたのは、mathjax-nodeが内部で抱える古いjsdom@11だった。
mathjax-nodeは、⑬Node.jsの棚卸しで「mathjax v3以降でNode.js対応が本体に統合され非推奨」として後日対応にしていたもの。更新も数年前から止まっており、ライブラリ側の修正は期待できない。
03mathjax本体(v4)へ移行
package.jsonにはすでにmathjax(v4系)が入っていたため、mathsvgのコードをmathjax本体のAPIに書き換えた。
Express・MongoDBによるIDチェック・レスポンスの形(id・math・name・svg・err)は変えず、呼び出し側のページは無修正で済むようにした。
初期化
変換処理
| ポイント | 内容 |
|---|---|
| Promise版の変換関数 | v4は大型化したフォントのデータを必要に応じて読み込むため、tex2svg()ではなくtex2svgPromise()が推奨 |
| 戻り値の形 | mathjax-nodeはSVG文字列を返したが、本体は<mjx-container>で包んだ要素を返す。中の<svg>だけを取り出して従来と同じ形にした |
| エラーの扱い | 本体の既定ではTeXの構文エラーが赤字のSVGとして描画される。formatErrorで例外にし、従来のdata.errorsと同じくerrを返すようにした |
| ディスプレイ数式 | mathjax-nodeのformat: "TeX"はdisplay: trueに相当 |
| フォント | v4は標準フォントがNew Computer Modernに変わり、見た目が以前と少し異なる |
動作確認と依存の整理
appw.jpの数式記事で表示を確認したうえで、mathjax-nodeをアンインストールした。
04振り返り
- モジュールの有効化は「転送先の形式」で考える:
proxyだけでは転送できず、http://ならproxy_http、ws(s)://ならproxy_wstunnelが別途必要。移設時はWebSocket系の確認で満足してしまっていた - 非推奨警告は早めに出どころを確認する:今は警告だけでも、Node.jsのバージョンアップで削除されれば突然止まる。
npm lsで依存の連鎖を辿れば、直接使っていないライブラリでも特定できる - ⑬の残り宿題:
request・jsdom-no-contextify・http/httpsの整理は、次にNode.jsを上げる前に片付ける予定