web-dev-qa-db-ja.com

node / express REST APIアプリケーション-GETメソッドにパラメーターを渡す

背景

サンプルの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つのメソッドだけが必要な他の言語の他のフレームワークに慣れているため、これは奇妙に感じられます。これは不満ではありません!私の脳がシステムが別の方法で機能することを「期待」している理由を説明するかもしれない単なるコメント。

8
Happydevdays

2つの個別のメソッドを作成する必要がありますか?1つはパラメーターを受け入れるもので、もう1つは受け取らないものですか?

これを試す前にこれを投稿したと思いますか?

答えはイエスです。

パラメータを受け入れるルートは次のようになります。

app.get('/emergency/:id', function (req, res, next) {
    var id = req.params.id;
    console.log('The id: ' + id);
});
11
Tom

はい、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 を参照してください。

1
Gaurav Israni

私はそれがうまくいくかどうか、あなたがこのようなことを試すことができるかどうかわかりません

app.get('/emergency/:var(:id/|)', function (req, res, next) {
    var id = req.params.id;
    console.log('The id: ' + id);
});
0
Atul Agrawal