これは問題なく動作するCURLの例である:
curl -X POST \
<url> \
-H 'authorization: Bearer <token>' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F [email protected] \
-F userId=<userId>
isomorphic-fetch]1を使ってこのリクエストを再現しようとしています。
以下のコードを試してみました:
const formData = new FormData();
formData.append('file', file);
formData.append('userId', userId);
return fetch(`<url>`, {
method: 'POST',
headers: {
'Content-Length': file.length
'Authorization: Bearer <authorization token>',
'Content-Type': 'multipart/form-data'
},
body: formData
})`
FormDataに渡された
fileを生成するために
fs.readFileSync` を使用しています。
先ほどの例では、トークンに埋め込まれた userId
が formData
から渡された userId
と一致しないというエラーメッセージとともに 401
HTTP ステータスコード (unauthorized) が返されます。
つまり、REST API に届く FormData
は適切に形成されていないのではないだろうか。
この問題は Content-Length
ヘッダーに関連しているのかもしれないが、それを計算する良い方法は見つからなかった(Content-Length
ヘッダーを使用しないと、411
HTTP ステータスコード Content-Length
ヘッダーが見つからない)。
Content-Lengthヘッダーの値が正しくないために失敗しているのでしょうか?
これが失敗する理由や、より良いデバッグ方法について、他に何か提案はありますか?
この問題を明確にするためにさらに情報が必要であれば、質問してください。
**アップデート
formData.getLengthSync()メソッドを使って正しい
Content-Length`値を取得するために、form-dataモジュールを試してみました。
しかし、問題は変わりません(HTTPステータスコードのレスポンスが401
エラー)。