JavaScript で文字列のバイト数を求める (POST・PUT リクエストやレスポンスの文字列が途中で切れる問題)

Node.js の組み込みモジュールである http モジュールを使用して、POST メソッドや PUT メソッドでデータを送信する処理があったのだけど、どうも送信データの末尾20バイトぐらいが欠損してしまっていた。

一連のデータ送信処理は海外のサイトからいただいてきたモノだったので、直感的に「(英語圏には登場しない) 全角文字が悪さしてる?」と思ったのだが、何が悪いか、何を変えたら上手く直るのか分からなかった。

んで、コードをよく読むと、リクエストヘッダに指定している Content-Length が怪しく感じた。req.body.length と、送信する文字列の .length を指定していた。

request.setHeader('Content-Length', req.body.length);

そこでよくよく調べてみると、文字列のバイト数を求めるには、Buffer.byteLength() というメソッドを使うようだ。

request.setHeader('Content-Length', Buffer.byteLength(req.body, 'utf8'));

このように書き換えたら上手くいった。Content-Length 指定、こんな大事だったのね…。


そしてコレを書こうと思って Node.js のドキュメンテーションを開いたら、サンプルコードにモロに Buffer.byteLentgh() 書いてあった…。

request.getHeader(name)

javascript request.setHeader('content-type', 'text/html'); request.setHeader('Content-Length', Buffer.byteLength(body));

よく読もうね、自分…。