2017-03-08 3 views
1

私はRESTとExpressを使用するのが本当に新しいので、これをREST APIの tutorialに従っています。ここに私のapp.jsコードは次のとおりです。POSTメソッドを使用しているときNode.js req.bodyが空です

var express = require('express'); 
var bodyParser = require('body-parser'); 
var mongoose = require("mongoose"); 

var app = express(); 
var port = parseInt(process.env.PORT, 10) || 3000; 

app.use(bodyParser.urlencoded({ extended: true})); 
app.use(bodyParser.json()); 

Genre = require('./models/genre'); 

//Connect to mongoose 
mongoose.connect('mongodb://localhost/bookstore'); 

var db = mongoose.connection; 

app.listen(port); 
console.log('Running on port 3000\n\n'); 

app.post('/api/genres', function(req, res){ 
     console.log(req.body); 
     var genre = req.body; 
     Genre.addGenre(genre, function(err, genre){ 
      if (err) { 
       console.log(err); 
       res.send({status: 'something went wrong'}); 
      }else{ 
      res.send({status: 'saved'}); 
      res.json(genre);} 
     }); 
}); 

私はPOSTリクエストを確認するためにFirefoxの上で休憩簡単を使用しています。本文が空であるため、生成されるエラーは「Genre Validation failed」です。このために使用されるスキーマは、モデルで定義されています

var mongoose = require("mongoose"); 

//Genre Schema 
var genreSchema = new mongoose.Schema({ 

    name: { 
     type: String, 
     required: true 
    }, 
    create_data:{ 
     type: Date, 
     default: Date.now 
    } 
}); 

var Genre = module.exports = mongoose.model('Genre', genreSchema); 

// add genre 
module.exports.addGenre = function(genre, callback){ 
    Genre.create(genre, callback); 
}; 

私は他のいくつかの人気のスレッドを試みたが、それはまだ問題を解決されていません。私は、モジュールをどのようにインポートするのかを並べ替えてみました。そして、 'application/x-www-form-urlencoded'を使ってフォームとしてデータを入力しました。何か案が?

編集:にconsole.log(req.body)の出力:。にconsole.log(REQ)の

{} 

出力がjsfiddle.net上jbkb1yxaである(StackOverflowのは、文句を言わない私に埋め込むましょう私は、謝罪を低評判ポイントを持っているので、複数のリンク)簡単なRESTの スクリーンショット:。 http://imgur.com/6QmQqRV

+0

console.log(req)とconsole.log(req.body)の結果を表示します。 POST要求を間違った形式で渡している可能性があります。リクエスト本文がJSONであることを確認してください。パラメータを渡す方法のイメージを追加することができます。 – rresol

+0

POSTリクエストはどのように行われていますか? – jfriend00

+0

これはおそらく、あなたがapiにPOST要求をしているのと同じことです。 – nozari

答えて

0

「X-www-form-urlencoded」を選択すると、コンテンツタイプに3つのオプションがあります。機能するはずです。

app.use(bodyParser.urlencoded({ 
    extended: true 
})); 

https://github.com/expressjs/body-parser

「ボディ・パーサ」ミドルウェアのみJSONを処理し、生のJSONデータペイロードをHTTPのPOSTアクションをテスト生のオプションを選択するには、ポストマンでデータを

をURLエンコードして参照してください。また

Content-Type: application/json 

、二重引用符であなたのJSONペイロードのキー/値として使用される文字列をラップしてください:以下のヘッダパラメータを設定します。

body-parserパッケージは、複数行の未処理のJSONペイロードをうまく解析します。

{ 
    "foo": "bar" 
} 
0

あなたはREST簡単側のデータセクションに正しいMIMEタイプを入力する必要はあり:

application/json 
+0

私はそれをやってみましたが、それでも助けにはなりません。 –

0

データベースを呼び出すことで、探しているものが見つからない可能性があります。私が最初にMongooseを学び始めたときの私にとっての大きな苦痛点の1つは、空の応答がerrと数えられると誤って期待していたということでしたが、そうではありません。

res.jsonの文の上にconsole.log(genre)を置くと記録されるのは何ですか?

さらに、res.sendの後にres.jsonを使用していますか?

+0

else文は実行されません。それはifに残っていて、何かが間違っていたという印をつけます。 Genre.addGenreの前にコンソールロギングを実行すると[オブジェクトオブジェクト]になります。 –

0

だから、それはおそらく延長の問題だったと思う。私は同じコードを使用してPOSTMANを使ってPOSTリクエストをクロームで送信しましたが、今はうまく動作しています。以前はPostmanでも動作していませんでしたが、クロムをプロキシサーバーを使用しないように設定した後は正常に動作します。

ありがとうございました。

関連する問題