Error: parser error, 18 of 135 bytes parsed (node.js Objective-C)の対処方法


Error: parser error, 18 of 135 bytes parsed という、expressのエラーが出た場合の対処法です。(Postのみ)
原因は、BodyParserの仕様にクライアントがそっていない可能性があります。

■解決策

プロパティを追加する際には、form-data/nameの後のコロンやダブルクオーテーションのチェック、改行コードに\r\nを必ず使う。

//リクエスト名の追加
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\" \r\n",keyName] dataUsingEncoding:NSUTF8StringEncoding]];

■確認方法

node.js 側のexpressのBodyParserを外し、req.bodyを文字列に変換して確認することができます。

■関連キーワード

node.js express
express bodyparser
express post file
(ボタンをクリックすると、検索管理サービス「アトサク」にキーワードを登録できます。)
アトサクについては、本家ページをご参照下さい

■Good

//結果用のデータを作成する。
NSMutableData *body = [NSMutableData data];
NSString *boundary = @"-----123456-----";
//boundaryの追加
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//リクエスト名の追加
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\" \r\n",keyName] dataUsingEncoding:NSUTF8StringEncoding]];
//改行
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//データの追加
[body appendData:bodyData];
//改行
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//閉じる
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boudary] dataUsingEncoding:NSUTF8StringEncoding]];

■Bad

改行コードに\nを使ってしまう。


//結果用のデータを作成する。
NSMutableData *body = [NSMutableData data];
NSString *boundary = @"-----123456-----";
//boundaryの追加
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//リクエスト名の追加
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\" \n",keyName] dataUsingEncoding:NSUTF8StringEncoding]];
//改行
[body appendData:[@"\n" dataUsingEncoding:NSUTF8StringEncoding]];
//データの追加
[body appendData:bodyData];
//改行
[body appendData:[@"\n" dataUsingEncoding:NSUTF8StringEncoding]];
//閉じる
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

■bad2

nameにクオーテーションをつけない。

//結果用のデータを作成する。
NSMutableData *body = [NSMutableData data];
NSString *boundary = @"-----123456-----";
//boundaryの追加
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//リクエスト名の追加
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@ \r\n",keyName] dataUsingEncoding:NSUTF8StringEncoding]];
//改行
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//データの追加
[body appendData:bodyData];
//改行
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//閉じる
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boudary] dataUsingEncoding:NSUTF8StringEncoding]];
[sc:採用情報へのリンク]