2017-04-04 17 views
2

私はExpressとMongooseを初めて使用しています。私は現在、チュートリアルではない最初のプロジェクトに取り組んでおり、問題にぶつかっています。Express GETルートはパラメータでは機能しません

私は複数のルートを持っているが、彼らはこのようなindex.jsで定義されています。ルートで

app.use('/api/client',require('./routes/client')); 
app.use('/api/host',require('./routes/host')); 

、PUTやPOSTのように、仕事の複数の動詞があります。ここで が問題のルートです(私はここで提示されていますが、ここで何を提示しているもの、としてうまく機能していないことを複数の操作を行いますしようとしています):

router.get('/ama/:id', function (req, res, next) { 
    Ama.findById(req.params.id).then(function(Ama){ 
     res.send(Ama); 
    }); 
}); 

これは動作するはずです、右?そのIDを持つデータベース内のドキュメントを返す必要があります。そして、おそらく約100回、文書が消えているかどうかを確認しました。私はIDを削除し、大幅にルートを簡素化し、簡単な応答を作る場合、ルートは働く は今、:

router.get('/ama', function (req, res, next) { 
    res.send({type:"GET"}); 
}); 

それはすぐに私は、パラメータを追加すると、私が得ることを、とても奇妙です

<pre>Cannot GET /api/host/ama</pre> 

in郵便配達員。

アイデア? Mongodが走っている、私の他のルートが働いている。前に実行するすべての

router.get('/ama/:id', function (req, res, next) { 
    Ama.findById(req.params.id).then(function(Ama){ 
     res.send(Ama); 
    }) 
    res.send(req.params.id)*/ 
}); 

まず、res.send(req.params.id)

+0

どこで/ api/host/amaを呼び出しますか?ちょうどポストマンを使用して?あなたがreq.params.idをログすると、あなたは何を得ますか? –

+0

@CédricDeDyckerはい、私は現在Postmanを使用しています。 req.params.idをログに記録することはできません。なぜなら、ルートのコードが最初から実行されていないように思えるからです。少なくとも私がそれを記録しようとしたとき、何も起こらない。 –

答えて

3

に見えます:

/api/host/ama?id=SOMEID 

しかし、あなたがどのように見えるURLのために宣言したルートを持っていますこの:つまり

/api/host/ama/SOMEID 

は、idはURLのパスの一部であり、クエリ文字列パラメータとして渡されていない(つまりは/:idが何を意味するかだ:それはURLルートの一部のプレースホルダです一致する必要があります)。

だからどちらかがこのような何かへのパス(/api/host/ama/58e395a8c6aaca2560089c‌​e7)にIDを追加することによって、要求URLを変更したり、ルートハンドラを書き換える:

router.get('/ama', function (req, res, next) { 
    Ama.findById(req.query.id).then(function(Ama){ 
     res.send(Ama); 
    }); 
}); 

しかし、私は元を使用して助言する(作りますURLのid部分)。

+0

私の質問をもう一度読むべきだと思います。あなたのソリューションはすでに実装しようとしているようです。 –

+0

@AndreasKristensen '/ api/host/ama /:id'というルートを持っているなら、あなたは'/api/host/ama'(IDなし)を取得しているというエラーがどうして起こりますか? – robertklep

+0

私は分かりません。 http:// localhost:5000/api/host/ama?id = 58e395a8c6aaca2560089ce7' –

0

パラメータが正常に動作する必要がありますが、あなたがあなたのクエリに.exec追加する逃したようだ

Ama.findById(req.params.id).exec().then(function(Ama){ 
     res.send(Ama); 
}) 
+0

残念ながら、これはうまくいきません。私は同じ "得られない"応答を得る。 –

1

ここでは2つの問題があります。 res.send(Ama);であり、おそらく全体の応答を送信します。 .exec()メソッド呼び出しがありません(詳細は、CédricDe Dyckerの回答を参照してください)。 res.send()は一度しか確実に使用できません。複数のものを作成したい場合は、代わりにres.write()が必要です。また、約束の拒否を処理しないので、データベースのエラーを処理しません。あなたはいつも約束拒否を処理しなければならない理由を知るためにこの回答を参照してください:あなたはこのURLを取得しようとしているようShould I refrain from handling Promise rejection asynchronously?

+0

2番目の 'res.send'行はコピー・ペーストから残っていましたが、今はなくなりました。 –

関連する問題