[解決済み] Node.js: req.paramsとreq.bodyの比較
質問
MEANスタックでnode、express、angular、mongodbを使って基本的なtodoアプリを作るために、いくつかの異なるチュートリアルからコードをこつこつと集めています。あるチュートリアルでは、GET、POST、DELETEアクションのためのAPIを作成することをカバーしていましたが、POSTを無視しました。そこで、私は既存のTodoを更新する関数を書くことに挑戦しました。この関数が動作するようになったとき、req.paramsに関連する理解できないエラーに遭遇しました。
関連するコード
ノードです。
app.js内
app.put('/api/todos/:_id', ngRoutes.update);
につながる。
exports.update = function(req, res){
var user_id = req.cookies ?
req.cookies.user_id : undefined;
Todo.findByIdAndUpdate(req.params._id,
{ $set: {
updated_at : Date.now(),
content : req.body.formText
}}, function (err, todo) {
if (err)
res.send(err)
Todo.find({ user_id : user_id}, function(err, todos) {
if (err) res.send(err);
res.json(todos);
});
});
};
Angularです。
$scope.update = function(id) {
$http.put('/api/todos/' + id, this.todo)
.success(function(data) {
console.log(data);
$scope.todos = data;
})
.error(function(data) {
console.log('Error: ' + data);
});
};
JADE/HTMLです。
form(ng-submit="update(todo._id)")
input.update-form(ng-show="todo.updating" type="text", name="content", ng-model="todo.formText" placeholder="{{todo.content}}")
この関数は正常に動作します。問題のTodoを更新し、更新された値でページに再読み込みされるようにリスト全体を返します。
しかし、ノードのコード内で
content : req.body.formText
になります。
content : req.params.formText
HTTPレスポンスとして、以下のエラーが表示されます。
Object {
message: "Cast to string failed for value "undefined" at path "content"",
name: "CastError",
type: "string",
path: "content" }
whileでも、関数の他の場所で。
req.params._id
は、Todo の '_id' プロパティを取得し、それを使ってデータベース内の適切なドキュメントを検索するのに問題なく動作します。さらに、Firefox の開発者ツールでリクエストを表示すると、todo オブジェクトが JSON 形式で "Params" タブの下に表示されます。
なぜこのようなことが起こるのでしょうか?req.paramsとreq.bodyの違いは何ですか?また、なぜ後者はうまくいき、前者はうまくいかないのですか?
解決方法は?
req.params
はルートパラメータ用で、フォームデータ用ではありません。
そのルートであなたが持っている唯一のパラメータは
_id
:
app.put('/api/todos/:_id', ...)
docsから。
req.params
このプロパティは、以下のプロパティにマッピングされたオブジェクトです。 という名前のルートの "parameters "を指定します。たとえば、ルート /user/:nameとすると、"name "プロパティはreq.params.nameとして利用できます。 このオブジェクトのデフォルトは{}です。
のソースになります。 http://expressjs.com/en/4x/api.html#req.params
req.body
リクエストで送信されたデータのキーと値のペアが含まれています。 の本体です。デフォルトでは未定義であり、以下のような場合に設定されます。 body-parserやmulterなどのボディパーシングミドルウェアを使用します。
のソースになります。 http://expressjs.com/en/4x/api.html#req.body
関連
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsで環境変数を読み込む
-
[解決済み] Node.jsでファイル/ディレクトリが存在するかどうかを同期的にチェックする
-
[解決済み] Node.js上のExpress.jsでGET(クエリ文字列)変数を取得する方法とは?
-
[解決済み] Node.jsのnpmモジュールをアンインストールするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】AWS Lambdaでnodejsの「ref」モジュールを使用すると「invalid ELF header」と表示される件
-
[解決済み】MongoClient v3.0使用時、db.collectionは関数ではない
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] E: npm パッケージを見つけることができません。
-
[解決済み] ExpressJS : res.redirect()が期待通りに動作しない?
-
[解決済み] Yarn にパッケージを強制的に再インストールさせるにはどうしたらいいですか?
-
[解決済み] ランタイム 'node' が PATH で見つからない - Visual Studio Code と Node.js
-
[解決済み] エラーです。Cannot find module 'ejs'
-
[解決済み] DynamoDBで一括削除するにはどうしたらいいですか?
-
[解決済み] npm not able to find a fileに関連するエラーは何が原因でしょうか?node_modules サブフォルダ内にコンテンツがありません。なぜでしょうか?