バージョン更新時におけるフィードの検証

フィードを検証するようにした。投稿時にはめったに壊れないはずなので、バージョンを上げた時にのみ検証している。バージョンが上がった時は、生成する仕組みやテンプレートが変わり、壊れたりするかもしれない。数ファイルだけなので、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()というような謎のコードを書く必要が出てくる。便利機能はちゃんと使った方がいい。