2013-06-09 10 views
354

私はこのようなクエリのためのparamsを取得する方法を知っている:この場合"?"の後のGETパラメータへのアクセス方法エクスプレスで?

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

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

しかし、/sample/2?color=redのようなURLの場合、どのように変数colorにアクセスできますか?

私はreq.params.colorを試しましたが、動作しませんでした。

答えて

485

express referenceを確認したところ、req.query.colorは私が探している値を返すことがわかりました。

+0

あなたはどのように "ID" を検証する方法を教えていただけますか? –

+1

@AnandRaj:どういう意味ですか? "id"を検証する方法は?どのようなバリデーションが必要ですか?ところで、あなたの関数では、 'id sample'の値を' var sampleId = req.params.id; 'のように得ることができます。 –

+0

最新版では 'req.params.whatever'を使用してください。 – adelriosantiago

58

更新:req.param()は今後廃止予定ですので、今後この回答は使用しないでください。


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

検索は次の順序で実行されます:急行ガイドから

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

:あなたのケースでは

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

ガイドでは、次のように述べるんのでご注意:

req.bodyへのダイレクトアクセス、req.params、およびreq.queryを明確にするため を支持しなければならない - あなたが本当にからの入力を受け入れない限り、各オブジェクト。

実際には私は実際にはreq.param()が十分明確であると判断し、特定のタイプのリファクタリングを容易にしました。

+6

最新のExpressでは非推奨です。 http://expressjs.com/api.html#req.param – NullSpace

39

@ザグワイトの答えは正しいです。 req.param()は推奨されていません。 req.params,req.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']を使用して取得する必要があります。

13

明示的なマニュアルでは、req.queryを使用してQueryStringにアクセスする必要があります。

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

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

}); 
19

Heyクエリ文字列とパラメータが異なります。あなたは、単一のルーティングURL

の両方を使用する必要が

は怒鳴るの例を確認してくださいあなたの役に立つことの私。リンクはあなたの第二のセグメントを渡す

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

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

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

}); 

取得は、あなたのIDの例です:「?」http://localhost:port/file-upload/123

あなたは問題が使用してクエリ文字列として渡す変数を使用してください直面している場合オペレータ

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

    var id = req.query.id; 

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

    }); 

は、次の例のようにあなたをリンク取得:http://localhost:port/sample?id=123

単一の例の

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

52

使用req.query、ルートのクエリ文字列パラメータ req.queryを参照してください。 セイルートであれば、http://localhost:3000/?name=satyam名前のパラメータの値を取得したい、そして、あなたのルートハンドラは次のようになります「ゲット」: - 私は私のアプリケーションの一部で使用を開始しました

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

}); 
+0

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

0

素敵なテクニックエクスプレスのリクエストオブジェクトのクエリ、パラメータ、ボディフィールドをマージするオブジェクトを作成することです。

//./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をいくつかの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"; 
    } 
} 
+0

これはおそらく悪い考えです。これは、エンドポイントを維持するのが難しくなるためです。どのメソッド・クライアントがパラメータを渡すために使用されるかはもはや分かりません。 – sdgfsdh

+0

実際には、このアプローチの主な利点の1つは正直なところ、フィールドがどこから来たのか知る必要はありません。上記のExpressDataクラスはブリッジとして機能し、ビジネスロジックをモジュール化し、エクスプレスコントローラルートから移動することができます。つまり、 'req.query'、 'req.body'をコードにベイクするのではなく、お客様のビジネスコードは簡単にテスト可能です。 –

-1
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!') 
) 
+1

このコードスニペットをご利用いただきありがとうございます。 *なぜ*これが問題の良い解決策であるかを示すことによって[適切な説明は長期的価値を大幅に改善する](// meta.stackexchange.com/q/114762/350567)、将来的にはより有用になる他の同様の質問の読者。あなたの前提を含め、あなたの答えを[編集]して説明を加えてください。 – iBug

関連する問題