質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

3回答

2420閲覧

Node.js Express で jQuery.ajax のPOSTを受信できない

t4c62096

総合スコア20

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/07/09 18:59

サーバ側Node ソース

Node.js

1onst bodyParser = require('body-parser'); 2const express = require('express'); 3const app = express(); 4app.use(bodyParser.json()); 5app.use(express.static(__dirname + '/static')); 6app.post('/test', async (req, res) => { 7 console.log(JSON.stringify(req)); 8}); 9

クライアント側

Javascript(jQuery)

1$.ajax({ 2 url: 'http://localhost/test', 3 type: 'POST', 4 data: { id: '12345' }, 5 dataType: 'json', 6 contentType: 'application/json', 7 });

これを実行すると、サーバ側で以下のエラーが発生します。

error

1SyntaxError: Unexpected token b in JSON at position 0 2 at JSON.parse (<anonymous>) 3 at createStrictSyntaxError (C:\Program Files (x86)\Nodist\bin\node_modules\body-parser\lib\types\json.js:158:10) 4 at parse (C:\Program Files (x86)\Nodist\bin\node_modules\body-parser\lib\types\json.js:83:15) 5 at C:\Program Files (x86)\Nodist\bin\node_modules\body-parser\lib\read.js:121:18 6 at invokeCallback (C:\Program Files (x86)\Nodist\bin\node_modules\body-parser\node_modules\raw-body\index.js:224:16) 7 at done (C:\Program Files (x86)\Nodist\bin\node_modules\body-parser\node_modules\raw-body\index.js:213:7) 8 at IncomingMessage.onEnd (C:\Program Files (x86)\Nodist\bin\node_modules\body-parser\node_modules\raw-body\index.js:273:7) 9 at IncomingMessage.emit (events.js:203:15) 10 at endReadableNT (_stream_readable.js:1145:12) 11 at process._tickCallback (internal/process/next_tick.js:63:19)

ちなみに、これが出る前にいろいろいじりまわしており、動作していることがあったのですが、console.log(req.body.id ) であっても値を取得することができませんでした。

ちなみに、Chrome Talend API Tester でリクエストしたり、URL?id=12345 の形式でPOSTすれば正常動作しました。

この違いがどのように作用しているのか、お分かりになる方にご教示いただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/07/09 21:28

bodyParser.json()でパースすべきJSONのbodyはどこでしょうか?
t4c62096

2020/07/10 00:19

bodyParser.json()が詳細に何をしているか、具体的な理解はしていないことをまずお話しておきます。 リクエストされたJSONをパースしていると想像していますが、ここでエラーが発生しているのでしょうか? だとしたら、何か記載漏れがあるということでしょうか。 あるいは、POSTされた要求に対してレスポンスする処理が console.log しかなく、返却すべき値がないことを指摘しているのでしょうか。 本件の主題は、リクエストが到達しないことであるため、レスポンスについては質問内容の対象外としているため、console.log のみを処理に記載しています。 ご質問の意図について再確認させてください。 答えになっているかわかりませんが、まずは記載させていただきました。
maisumakun

2020/07/10 00:29

> 本件の主題は、リクエストが到達しないことであるため いえ、「到達している」からbody-parserでエラーが発生しています。前提が誤りです。
guest

回答3

0

ベストアンサー

クライアント側からは JSON 文字列を POST しなければならないのですよね?

であれば、jQuery ajax のコードで data に設定するのは JSON 文字列とすべきところが、質問のコードでは JavaScript オブジェクトになっているところが問題の原因だと思うのですが。(今の質問のコードですと id=12345 という文字列が POST されていると思います)

JSON.stringify メソッドを使って JSON 文字列に変換してから data に設定して送信したらどうなりますか?

もしサーバーに POST 送信する文字列は JSON 文字列ではなく、application/x-www-form-urlencoded 形式 (即ち id=12345 というような文字列) でなければならないということであれば、data の設定は今のままで、contentType の設定を application/x-www-form-urlencoded に変更したらどうなりますか?

投稿2020/07/09 23:05

編集2020/07/09 23:37
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t4c62096

2020/07/10 00:46

ありがとうございました contentType の設定を application/x-www-form-urlencoded に変更 あるいは、data: JSON.stringify({xxx:xxxx}) とすることで解決できました。
guest

0

リクエストされたJSONをパースしていると想像していますが

いえ、$.ajaxdataにオブジェクトを書くとクエリ文字列形式に変換されます(jQuery公式)。そもそもJSONが送信されていません。

$.ajaxでのdataTypeの指定は、レスポンスの解釈のためのものであって、リクエストのエンコードではありません)

投稿2020/07/10 00:34

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t4c62096

2020/07/10 00:45

なるほど。理解しました。ありがとうございました。
guest

0

そもそもミドルウェアにasync渡したらだめじゃない?

javascript

1app.post('/test', (req, res) => { 2console.log(req); 3}); 4

投稿2020/07/09 22:47

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t4c62096

2020/07/10 00:47

こちらは、動作はしているのですが、何か良くないことがありますか? よろしければ、追加情報をよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問