背景
サンプルのnodejs/express RESTインターフェースまたはAPIを学習のために作成しています。「emergency」という新しいルートを作成しました。
ファイルには、次のコードがあります。
router.get('/', function(req, res, next) {
//var ip = req.params.ip;
res.send('respond with a resource');
});
アプリケーションを起動して http:// myserver/tutorial1/emergency に移動すると、すべてが正常に機能し、「リソースで応答」というメッセージが表示されます。
目標
私のアプリケーションもパラメーターを受け入れることができるようにしたいと思います。たとえば、ユーザーが次の場所に移動すると
http://myserver/tutorial1/emergency
すべての緊急電話番号を照会して返してほしい。しかし、彼らもこれを行うことができるはずです:
http://myserver/tutorial1/emergency/12345
また、システムはデータベースに緊急レコード12345を照会し、適切な結果セットを返す必要があります。
問題/質問
両方のタイプのGETクエリに対応するために、コードを次のように変更しました。
router.get('/id', function(req, res, next) {
//var ip = req.params.ip;
res.send('respond with a resource');
});
次に、アプリケーションを実行して、
http://myserver/tutorial1/emergency/12345
できます。ただし、閲覧
http://myserver/tutorial1/emergency
404エラーメッセージで失敗します。
見つかりません
404
Error: Not Found
at /var/www/html/nodejs_samples/tutorial1/app.js:34:13
at Layer.handle [as handle_request] (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:312:13)
at /var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:280:7
at Function.process_params (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:330:12)
at next (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:271:10)
at /var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:618:15
at next (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:256:14)
at Function.handle (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:176:3)
at router (/var/www/html/nodejs_samples/tutorial1/node_modules/express/lib/router/index.js:46:12)
2つの別々のメソッドを作成する必要がありますか?1つはパラメーターを受け入れるもので、もう1つは受け取らないものですか? (別名メソッドのオーバーロード?)おそらくRESTの私の理解が間違っています。GETリクエストは次のようになります:
http://myserver/tutorial1/emergency
それとも常にこのように見えるべきですか:
http://myserver/tutorial1/emergency/{id}
たぶん、すべてのレコードに対してGETを行う適切な方法は、次のようなものです。
http://myserver/tutorial1/emergency/all
私も今、自分の質問をグーグルで検索しようとしていますが、正確な検索結果セットを得るのに十分なほど簡潔にそれを表現するのに苦労しています。
EDIT 1
これは、2つのメソッドを作成しようとすると、コードは次のようになります(これは機能します)
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
router.get('/:id', function(req, res, next) {
var id = req.params.id;
console.log(id);
res.send('got it');
});
しかし、システムが空のパラメーターをチェックできる1つのメソッドだけが必要な他の言語の他のフレームワークに慣れているため、これは奇妙に感じられます。これは不満ではありません!私の脳がシステムが別の方法で機能することを「期待」している理由を説明するかもしれない単なるコメント。
2つの個別のメソッドを作成する必要がありますか?1つはパラメーターを受け入れるもので、もう1つは受け取らないものですか?
これを試す前にこれを投稿したと思いますか?
答えはイエスです。
パラメータを受け入れるルートは次のようになります。
app.get('/emergency/:id', function (req, res, next) {
var id = req.params.id;
console.log('The id: ' + id);
});
はい、URLの各タイプをリッスンする2つの異なる関数が必要です。これは、URL
http://localhost/example/abcd will get received in
router.get('/example/:username',testFunction1);
一方
http://localhost/example will be received in
router.get('/example',testFunction2);
NodejsでGETメソッドを介してパラメーターをフェッチする手順の詳細については、記事 http://codewhoop.com/article/Nodejs%20Getting%20parameters%20through%20GET%20method を参照してください。
私はそれがうまくいくかどうか、あなたがこのようなことを試すことができるかどうかわかりません
app.get('/emergency/:var(:id/|)', function (req, res, next) {
var id = req.params.id;
console.log('The id: ' + id);
});