フィードを検証するようにした。投稿時にはめったに壊れないはずなので、バージョンを上げた時にのみ検証している。バージョンが上がった時は、生成する仕組みやテンプレートが変わり、壊れたりするかもしれない。数ファイルだけなので、W3C Feed ValidatorのAPIを利用した。
APIはSOAPとなっているが、output
パラメーターをsoap12
にし、普通にウェブ・フォームとして(x-www-form-urlencoded
で)POSTするとXMLで返ってくるというもののようだ。node-soapパッケージなどを使う必要はない。
node-fetchパッケージを使う場合は、&
でつなげた文字列をbody
オプションに指定するのではなく、URLSearchParams
オブジェクトを使う。Fetch標準では、body
オプションの値がURLSearchParams
だった場合、Content-Type
ヘッダーを設定すると規定されているので、headers
オプションを指定しなくて済む。もちろんnode-fetchパッケージでも実装されている。
const body = new URLSearchParams();
body.append("manual", 1);
body.append("output", "soap12");
const feed = await fs.readFile("feed.xml", "utf8");
body.append("rawdata", feed);
const res = await fetch("https://validator.w3.org/feed/check.cgi", {
body,
method: "POST"
});
よくFetchと共に使うFormDataオブジェクトの書き方と合わせるためにappend()
を使っている。普通にオブジェクトを渡してURLSearchParams
オブジェクトを作成した方がすっきりする。あとはfetch()
するだけなので、body
という名前でURLSearchParams
オブジェクトを作っておくと、ちょっと短く書ける。
返ってきたXMLを扱いやすくするには、xml2jsonパッケージではなく、xml2jsパッケージでもなく、fast-xml-parserパッケージが(現在は)いいようだ。速いし、メンテされている。
parse()
メソッドでは、それほど厳密に扱う必要もないので、ignoreNameSpace
オプションを有効にして、名前空間を削除すると、すらすらとドット表記法で参照できる。またarrayMode
に/^(error|warning|info)$/
としておくと、エラー等のみ常に配列として処理できるようになる。そうでない場合はエラーがひとつだけの場合に配列に変換するか、[errors].flat().map()
というような謎のコードを書く必要が出てくる。便利機能はちゃんと使った方がいい。