「?」の後にGETパラメータにアクセスする方法 Expressで?


527

私はこのようなクエリのパラメータを取得する方法を知っています:

app.get('/sample/:id', routes.sample);

この場合、私が使用することができますreq.params.id(たとえば、パラメータを取得するために、2中を/sample/2)。

しかし、URLのような/sample/2?color=red場合、変数にアクセスするにはどうすればよいcolorですか?

試しましたreq.params.colorがうまくいきませんでした。

回答:


776

だから、明示的な参照をチェックした後、私がreq.query.color探している値を返すことがわかりました。

req.paramsはURLに「:」が付いているアイテムを参照し、req.queryは「?」に関連付けられているアイテムを参照します

例:

GET /something?color1=red&color2=blue

次に、エクスプレスでは、ハンドラー:

app.get('/something', (req, res) => {
    req.query.color1 === 'red'  // true
    req.query.color2 === 'blue' // true
})

「id」の検証方法を教えてください。
Anand Raj

1
@AnandRaj:「ID」を検証する方法:どのような検証が必要ですか?ところで、あなたはidあなたの関数の値をこのように得ることができます:var sampleId = req.params.id;
Jochem Schulenklopper 2017

4
req.params.whatever最新バージョンで使用してください。
adelriosantiago 2017

3
req.paramsは違う心req.queryexpressjs.com/en/api.html#req.params expressjs.com/en/api.html#req.query @adelriosantiago
caesarsol

81

ルートのクエリ文字列パラメーターの値を取得するには、req.queryを使用します。req.queryを参照してください。ルートにある場合、http:// localhost:3000 /?name = satyam nameパラメータの値を取得すると、「Get」ルートハンドラは次のようになります。

app.get('/', function(req, res){
    console.log(req.query.name);
    res.send('Response send to client::'+req.query.name);

});

おそらく、完全な答えを得るためのクエリ文字列に関する情報
Schuere

67

更新: req.param()は非推奨になりました。今後はこの回答を使用しないでください。


あなたの答えがそれを行うための好ましい方法ですが、URL、投稿、ルートのパラメータにすべてでアクセスできることも指摘しておきたいと思いますreq.param(parameterName, defaultValue)

あなたの場合:

var color = req.param('color');

エクスプレスガイドから:

検索は次の順序で実行されます。

  • req.params
  • req.body
  • req.query

このガイドには次のように記載されています。

明確にするために、req.body、req.params、およびreq.queryに直接アクセスすることをお勧めします-各オブジェクトからの入力を本当に受け入れない限り。

しかし実際には、私はreq.param()十分に明確であることがわかり、特定のタイプのリファクタリングをより簡単にします。


53

クエリ文字列とパラメーターが異なります。

両方を単一のルーティングURLで使用する必要があります

以下の例を参考にしてください。

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')

  ................

});

2番目のセグメントを渡すためのリンクを取得するのがIDの例です。http:// localhost:port / sample / 123

問題が発生した場合は、「?」を使用してクエリ文字列として変数を渡すを使用してください オペレーター

  app.get('/sample', function(req, res) {

     var id = req.query.id; 

      ................

    });

次の例のようにリンクを取得します。http:// localhost:port / sample?id = 123

1つの例の両方

app.get('/sample/:id', function(req, res) {

 var id = req.params.id; //or use req.param('id')
 var id2 = req.query.id; 
  ................

});

リンクの例を取得:http:// localhost:port / sample / 123?id = 123


2
ありがとうこの回答はとても役に立ちました!
Bruno Tavares

44

@Zugwaitの答えは正しいです。req.param()廃止予定です。あなたは使用する必要がありますreq.paramsreq.queryまたはreq.body

しかし、それをより明確にするために:

req.paramsルート値のみが入力されます。つまり、のようなルート/users/:idがあるid場合、req.params.idまたはのいずれかにアクセスできます。req.params['id']

req.queryreq.bodyが移入され、すべてにかかわらず、彼らはルートであるかどうかの、のparams。もちろん、クエリ文字列のパラメーターはで使用できreq.query、投稿本文のパラメーターはで使用できますreq.body

したがって、colorルートにないので、質問に答えるには、req.query.colorまたはを使用してそれを取得できるはずreq.query['color']です。


17

Expressマニュアルには、QueryStringにアクセスするにはreq.queryを使用する必要があると記載されています。

// Requesting /display/post?size=small
app.get('/display/post', function(req, res, next) {

  var isSmall = req.query.size === 'small'; // > true
  // ...

});

7
const express = require('express')
const bodyParser = require('body-parser')
const { usersNdJobs, userByJob, addUser , addUserToCompany } = require ('./db/db.js')

const app = express()
app.set('view engine', 'pug')
app.use(express.static('public'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.get('/', (req, res) => {
  usersNdJobs()
    .then((users) => {
      res.render('users', { users })
    })
    .catch(console.error)
})

app.get('/api/company/users', (req, res) => {
  const companyname = req.query.companyName
  console.log(companyname)
  userByJob(companyname)
    .then((users) => {
      res.render('job', { users })
    }).catch(console.error)
})

app.post('/api/users/add', (req, res) => {
  const userName = req.body.userName
  const jobName = req.body.jobName
  console.log("user name = "+userName+", job name : "+jobName)
  addUser(userName, jobName)
    .then((result) => {
      res.status(200).json(result)
    })
    .catch((error) => {
      res.status(404).json({ 'message': error.toString() })
    })
})
app.post('/users/add', (request, response) => {
  const { userName, job } = request.body
  addTeam(userName, job)
  .then((user) => {
    response.status(200).json({
      "userName": user.name,
      "city": user.job
    })
  .catch((err) => {
    request.status(400).json({"message": err})
  })
})

app.post('/api/user/company/add', (req, res) => {
  const userName = req.body.userName
  const companyName = req.body.companyName
  console.log(userName, companyName)
  addUserToCompany(userName, companyName)
  .then((result) => {
    res.json(result)
  })
  .catch(console.error)
})

app.get('/api/company/user', (req, res) => {
 const companyname = req.query.companyName
 console.log(companyname)
 userByJob(companyname)
 .then((users) => {
   res.render('jobs', { users })
 })
})

app.listen(3000, () =>
  console.log('Example app listening on port 3000!')
)

7
このコードスニペットをありがとうございます。このコードスニペットは、制限された即時の助けを提供する可能性があります。適切な説明が大幅に長期的な価値を向上させるだろう示すことによって、なぜこれが問題に良い解決策であり、他の、同様の質問を将来の読者にそれがより便利になるだろう。回答を編集して、仮定を含めて説明を追加してください。
iBug 2018年

2

私がExpress上のいくつかのアプリで使い始めた素晴らしいテクニックは、Expressのリクエストオブジェクトのクエリ、パラメーター、ボディフィールドをマージするオブジェクトを作成することです。

//./express-data.js
const _ = require("lodash");

class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);
     }

}

module.exports = ExpressData;

次に、コントローラー本体、またはエクスプレスリクエストチェーンのスコープ内の他の場所で、次のようなものを使用できます。

//./some-controller.js

const ExpressData = require("./express-data.js");
const router = require("express").Router();


router.get("/:some_id", (req, res) => {

    let props = new ExpressData(req).props;

    //Given the request "/592363122?foo=bar&hello=world"
    //the below would log out 
    // {
    //   some_id: 592363122,
    //   foo: 'bar',
    //   hello: 'world'
    // }
    console.log(props);

    return res.json(props);
});

これにより、ユーザーがリクエストに応じて送信した可能性のあるすべての「カスタムデータ」を単に「掘り下げる」ことができて便利です。

注意

なぜ「小道具」フィールド?これは削減されたスニペットだったので、私はいくつかのAPIでこの手法を使用し、認証/承認データをこのオブジェクトに格納します(以下の例を参照)。

/*
 * @param {Object} req - Request response object
*/
class ExpressData {

    /*
    * @param {Object} req - express request object
    */
    constructor (req) {

        //Merge all data passed by the client in the request
        this.props = _.merge(req.body, req.params, req.query);

        //Store reference to the user
        this.user = req.user || null;

        //API connected devices (Mobile app..) will send x-client header with requests, web context is implied.
        //This is used to determine how the user is connecting to the API 
        this.client = (req.headers) ? (req.headers["x-client"] || (req.client || "web")) : "web";
    }
} 

1
エンドポイントの保守が困難になるため、これはおそらく悪い考えです。クライアントがパラメーターを渡すためにどのメソッドを使用するかはもうわかりません。
sdgfsdh

これは、正直に言うと、フィールドの出所を知る必要がないというこのアプローチの主な利点の1つです。上記のExpressDataクラスはブリッジとして機能し、ビジネスロジックをモジュール化して、エクスプレスコントローラールートから移動します。つまり、「req.query」、「req.body」をコードにベイクしていません。これにより、ビジネスコードは簡単にテストでき、完全にExpressの外にあります。
Lee Brindley、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.