Node.jsのExpress.jsでGET(クエリ文字列)変数を取得する方法


1193

$_GETPHPで変数を取得するのと同じように、Node.jsでクエリ文字列の変数を取得できますか?

Node.jsではリクエストでURLを取得できることを知っています。クエリ文字列パラメーターを取得するメソッドはありますか?


6
@whitequarkの回答(投票数が最も多い回答)は正しい回答としてマークする必要があります。あなたの質問に出くわすあなたと同じ質問で他の人のためにそれを更新してもいいですか?
Dev01

エクスプレスリクエストでのクエリオブジェクトの使用- エクスプレスリクエストクエリの使用例を次に示します
drorw

@ Dev01彼は2014年以来アクティブではありませんlol
John Balvin Arias

Node.js APIボイラープレートをExpressjsとMongoDBで探している人がいる場合。これを試してください:github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

回答:


1183

Expressでは、これは既に行われており、req.queryを使用するだけで済みます。

var id = req.query.id; // $_GET["id"]

それ以外の場合は、NodeJSで、req.urlおよび組み込みurlモジュールに[url.parse](https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost)で手動でアクセスできます。

var url = require('url');
var url_parts = url.parse(request.url, true);
var query = url_parts.query;

24
ここで注意:.parse(url、trueurl.parse(urlStr, [parseQueryString], [slashesDenoteHost])
befzz

(もしあれば)hapiが提供する追加/より良い機能は何ですか?
BaltoStar 2013

180
これは受け入れられますが、推奨される答えではありません。下記参照!使用req.query
Cheeso 2013

2
以下のmikemcneilの回答の方が適しています。使用req.queryまたはreq.param(とは異なっているreq.params...以下を参照してください。
MindJuice

9
-1。上記のコードは重荷です—優れた開発者がその場でリファクタリングするものです。これは、「URLのクエリ文字列を取得する方法」に対する回答です。問題のURLは、たまたま名前が付けられたオブジェクト内requestにあり、Expressとは関係ありません。以下の@whitequarkの回答を参照してください(使用request.query
lunohodov

1649

タグでExpress.jsについて説明したので、Express固有の回答を次に示します。req.queryを使用します。例えば

var express = require('express');
var app = express();

app.get('/', function(req, res){
  res.send('id: ' + req.query.id);
});

app.listen(3000);

68
req.query.idを使用する必要があることに言及する価値があります。ブラケット表記を使用する必要はありません。
アレックス2013

Expressをインストールするには、次のようにします。sudo npm install -g express ---編集しようとしましたが、Alexis Kingが元に戻りました。
フェリペ

質問の中で、彼は配列のようなすべてのクエリ文字列パラメーターを取得する方法を探していました。正解はこれです:app.get( '/'、function(req、res){console.log(req.query);});
Richard Torcato 2016年

463

Expressでは、を使用しますreq.query

req.paramsルートパラメータのみを取得し、クエリ文字列パラメータは取得しません。エクスプレスまたは帆のドキュメントを参照してください。

(req.params)ルートパラメータをチェックします。例:/ user /:id

(req.query)クエリ文字列のパラメーターをチェックします。例:?id = 12 urlencoded body paramsをチェックします

(req.body)、例:id = 12 URLエンコードされたリクエスト本文を利用するには、req.bodyがオブジェクトである必要があります。これは、_express.bodyParserミドルウェアを使用して行うことができます。

つまり、ほとんどの場合、ソースに関係なくパラメータの値を取得する必要があります。その場合は、req.param('foo')

パラメータの値は、変数がルートパラメータ、クエリ文字列、またはエンコードされたリクエスト本文に含まれていたかどうかにかかわらず返されます。

補足:3つのタイプの要求パラメーターすべて(PHPと同様$_REQUEST)の共通部分を取得することを目的としている場合は、パラメーターをマージする必要があるだけです。これがSailsで設定する方法です。パス/ルートパラメータオブジェクト(req.params)には配列プロパティがあるため、順序が重要であることに注意してください(これはExpress 4で変更される可能性があります


req.param( 'STRING')が正解です。ここを参照してください:stackoverflow.com/questions/17007997/…(下にスクロールして、承認された回答の下に回答します)
Joseph Juhnke 14年

3
@deltab req.paramsは、Sailsドキュメントへのリンク です:sailsjs.org
#

7
req.paramを明示4.xで廃止され、代わりreq.params、req.body又はreq.queryを使用する必要がありますexpressjs.com/en/4x/api.html#req.param
swang

@swangは正しいです-私は最近これについてDoug Wilsonとダブルチェックしました、そしてreq.param()ヘルパー機能はExpress 5で完全に削除される可能性があります。これは2017年の後半まで差し迫っていないので、編集するのを待ちますそれまではこの答え。それまでの間:req.param()Express <= 3.x / Sails <= 0.12で、そして Express 4の最新の利用可能なリリースでは、非推奨のログメッセージが表示されますが、安全に使用できます。(Sailsユーザーの場合:の実装はreq.param()、Sails v1.0の時点でコアに移行し、将来的にはSailsで完全にサポートされる予定です。)
mikermcneil

142

あなたがしたいExpress.jsの場合req.params

app.get('/user/:id', function(req, res) {
  res.send('user' + req.params.id);    
});

8
express.jsでGET変数を取得するには、req.queryを使用できます。
Ben Sinclair、2011

6
@Andy req.paramsの方が優れています。req.param(name [、default])は、次のようになります。存在する場合、またはデフォルトの場合、param nameの値を返します。ルートパラメータ(req.params)をチェックします。例:/ user /:idクエリ文字列パラメータ(req.query)をチェックします。例:?id = 12urlencodedボディパラメータ(req.body)をチェックします。例:id = 12 body、req.bodyはオブジェクトである必要があります。これは、_express.bodyParserミドルウェアを使用して行うことができます。
Cris-O

このメモのおかげで、req.queryのreq.paramチェックを知りませんでした。
ベンシンクレア

3
req.param( 'parameterName')は、req.body、req.query、およびreq.paramsをチェックしますが、すべてのクエリパラメータがオブジェクトとして必要な場合は、req.queryを使用する必要があります。
mikermcneil

1
@mikermcneil req.param()とreq.params(object)を混同している可能性があります。expressjs docsによると、req.param()は3つのオブジェクトすべての値を探します。expressjs.com/api.html#req.param
ベンシンクレア

78

私は他の答えから学び、私のサイト全体でこのコードを使用することにしました:

var query = require('url').parse(req.url,true).query;

その後、あなたは電話することができます

var id = query.id;
var option = query.option;

getのURLは

/path/filename?id=123&option=456

2
クエリは単なる文字列なので、IDとオプションは未定義ではありませんか?正規表現などで2つの別々のパラメータを解析する必要があります。
ossek 2014年

1
@ossek私が原因の行為と考えているparsereq.urlオブジェクトに変換します。
ホイットフィン2015

1
@ossek、彼は([ここ]あなたはドキュメントでそれについての詳細を見つけることができます(そしてそれは内部的にクエリ文字列のモジュールを使用しています)オブジェクトへの照会プロパティーのポイントになりますurl.parseの二番目の引数として、真の提供ですnodejs.org/docs / latest / api /…
バーラト、2015年

働きました....本当にありがとう!!!
Prateek Gupta

50
//get query&params in express

//etc. example.com/user/000000?sex=female

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

  const query = req.query;// query = {sex:"female"}

  const params = req.params; //params = {id:"000000"}

})

48

ES6Expressを使用している場合は、次のdestructuring方法を試してください。

const {id, since, fields, anotherField} = request.query;

コンテキスト:

const express = require('express');
const app = express();

app.get('/', function(req, res){
   const {id, since, fields, anotherField} = req.query;
});

app.listen(3000);

デフォルト値も使用できますdestructuring

// sample request for testing
const req = {
  query: {
    id: '123',
    fields: ['a', 'b', 'c']
  }
}

const {
  id,
  since = new Date().toString(),
  fields = ['x'],
  anotherField = 'default'
} = req.query;

console.log(id, since, fields, anotherField)


デフォルト値を使用してオブジェクトの分解を使用する!+1
リード開発者

43

GETメソッドを介してパラメータを渡すには2つの方法があり

ますが、/ routename /のようにパラメータを渡すMVCのアプローチ:方法1のparamName
ます。たとえば、パラメータ値を取得するためにreq.params.paramnameを使用することができます。この場合は、コード以下を参照しているI Idをparam
リンクとして期待しています:http : //myhost.com/items/23

var express = require('express');
var app = express();
app.get("items/:id", function(req, res) {
    var id = req.params.id;
    //further operations to perform
});
app.listen(3000);

方法2:一般的なアプローチ: '?'を使用して変数をクエリ文字列として渡す 演算子
例については、クエリパラメータ
リンクが次のようになる可能性があるIDを期待しているコードを参照してください:http : //myhost.com/items? id=23

var express = require('express');
var app = express();
app.get("/items", function(req, res) {
    var id = req.query.id;
    //further operations to perform
});
app.listen(3000);

40

次のようなことができるはずです。

var http = require('http');
var url  = require('url');

http.createServer(function(req,res){
    var url_parts = url.parse(req.url, true);
    var query = url_parts.query;

    console.log(query); //{Object}

    res.end("End")
})

26

更新2014年5月4日

ここに保存されている古い回答:https : //gist.github.com/stefek99/b10ed037d2a4a323d638


1)Expressをインストールします。 npm install express

app.js

var express = require('express');
var app = express();

app.get('/endpoint', function(request, response) {
    var id = request.query.id;
    response.end("I have received the ID: " + id);
});

app.listen(3000);
console.log("node express app started at http://localhost:3000");

2)アプリを実行します。 node app.js

3)ブラウザでアクセスします: http://localhost:3000/endpoint?id=something

IDを受け取りました:何か


(私の答え以来多くのことが変わった、そして私は物事を最新に保つ価値があると信じています)


20

小さなNode.js HTTPサーバーがポート9080でリッスンし、GETまたはPOSTデータを解析して、応答の一部としてクライアントに送り返します。

var sys = require('sys'),
url = require('url'),
http = require('http'),
qs = require('querystring');

var server = http.createServer(

    function (request, response) {

        if (request.method == 'POST') {
                var body = '';
                request.on('data', function (data) {
                    body += data;
                });
                request.on('end',function() {

                    var POST =  qs.parse(body);
                    //console.log(POST);
                    response.writeHead( 200 );
                    response.write( JSON.stringify( POST ) );
                    response.end();
                });
        }
        else if(request.method == 'GET') {

            var url_parts = url.parse(request.url,true);
            //console.log(url_parts.query);
            response.writeHead( 200 );
            response.write( JSON.stringify( url_parts.query ) );
            response.end();
        }
    }
);

server.listen(9080);

parse.js名前を付けて保存し、「node parse.js」と入力してコンソールで実行します。


3
この例ではsysを要求する必要はありません
danwellman

20

ホワイトクォークはうまく反応した。しかし、Node.jsとExpress.jsの現在のバージョンでは、もう1行必要です。必ず 'require http'(2行目)を追加してください。この呼び出しがどのように機能するかを示す完全な例をここに投稿しました。実行http://localhost:8080/?name=abel&fruit=appleしたら、ブラウザに入力すると、コードに基づいたクールな応答が得られます。

var express = require('express');
var http = require('http');
var app = express();

app.configure(function(){
    app.set('port', 8080);
});

app.get('/', function(req, res){
  res.writeHead(200, {'content-type': 'text/plain'});
  res.write('name: ' + req.query.name + '\n');
  res.write('fruit: ' + req.query.fruit + '\n');
  res.write('query: ' + req.query + '\n');
  queryStuff = JSON.stringify(req.query);
  res.end('That\'s all folks'  + '\n' + queryStuff);
});

http.createServer(app).listen(app.get('port'), function(){
    console.log("Express server listening on port " + app.get('port'));
})

15

それはとても簡単です:

URLの例:

http://stackoverflow.com:3000/activate_accountid=3&activatekey=$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjzfUrqLrgS3zXJVfVRK

次を使用して、クエリ文字列のすべての値を出力できます。

console.log("All query strings: " + JSON.stringify(req.query));

出力

すべてのクエリ文字列:{"id": "3"、 "activatekey": "$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjz fUrqLrgS3zXJVfVRK"}

特定を印刷するには:

console.log("activatekey: " + req.query.activatekey);

出力

activatekey:$ 2a $ 08 $ jvGevXUOvYxKsiBt.PpMs.zgzD4C / wwTsvjzfUrqLrgS3zXJVfVRK



13

Express ^ 4.15.4で使用できます。

var express = require('express'),
    router = express.Router();
router.get('/', function (req, res, next) {
    console.log(req.query);
});

お役に立てれば。


6

express.jsあなたはかなり簡単にそれを得ることができ、あなたのコントローラ機能に必要なことは、次のとおりです。

app.get('/', (req, res, next) => {
   const {id} = req.query;
   // rest of your code here...
})

そして、es6構文を使用していると仮定すると、これですべてです。

PD。{id}Object destructuring、新しいes6機能のを表します。


私はノードでエクスプレスを使用しているので、これは完璧に機能しました。ありがとうございました!
user752746 2018

4
app.get('/user/:id', function(req, res) {
    res.send('user' + req.params.id);    
});

これを使用するか、リクエストパラメータから特別な要素を解析するためにbody-parserを試すことができます。


1
これが質問にどのように答えるかをさらに説明できますか?
Nico Haase

そして、これはどのように既存のパラメータリストを解析しますか?
Nico Haase

node.jsのbody-parserモジュールを使用できます
Mehedi Abdullah

1

それは実際には簡単です:

const express= require('express');
const app = express();

app.get('/post', (req, res, next) => {
  res.send('ID:' + req.query.id + ' Edit:'+ req.query.edit);
});

app.listen(1000);

// localhost:1000/post?id=123&edit=true
// output: ID: 123 Edit: true

0

urlモジュールを使用して、url.parseを使用してパラメーターを収集できます。

var url = require('url');
var url_data = url.parse(request.url, true);
var query = url_data.query;

expressjsでは、

var id = req.query.id;

例えば:

var express = require('express');
var app = express();

app.get('/login', function (req, res, next) {
    console.log(req.query);
    console.log(req.query.id); //Give parameter id
});


0

私の見解では、多くの人が2つの異なる概念を混ぜ合わせていると思います。REST開発中、私は「パス変数」と「リクエストパラメータ」(クエリパラメータ)の2つの方法でURLに情報を渡すことに慣れていました。RFCは、このようなURIの部分を説明しています。ここにリンクの説明を入力してくださいリクエストパラメータを渡す方法を著者が知りたいことを理解しました。トピックをわかりやすくしたいだけですが、解決策はここで何度も言及されました。

を使用してURIからクエリパラメータを取得できますrequest.query.<name of the parameter>。2番目に言及された解決策はrequest.params.<name of the parameter>、これを使用してパス変数を取得できます。


0

したがって、この「id」を受け取る方法は2つあります。1)paramsの使用:コードparamsは次のようになります。配列があるとします。

const courses = [{
    id: 1,
    name: 'Mathematics'
},
{
    id: 2,
    name: 'History'
}
];

次に、paramsの場合は次のようにします。

app.get('/api/posts/:id',(req,res)=>{
    const course = courses.find(o=>o.id == (req.params.id))
    res.send(course);
});

2)別の方法は、クエリパラメータを使用することです。したがって、URLは「..... \ api \ xyz?id = 1」のようになります。「?id = 1」はクエリ部分です。この場合、次のようなことができます。

app.get('/api/posts',(req,res)=>{
    const course = courses.find(o=>o.id == (req.query.id))
    res.send(course);
});


0

と同様ににGETリクエストを送信する必要がある場合(他の回答では変数を指定できることについて言及していません)、この関数を利用できます:IPDomainport

function getCode(host, port, path, queryString) {
    console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")

    // Construct url and query string
    const requestUrl = url.parse(url.format({
        protocol: 'http',
        hostname: host,
        pathname: path,
        port: port,
        query: queryString
    }));

    console.log("(" + host + path + ")" + "Sending GET request")
    // Send request
    console.log(url.format(requestUrl))
    http.get(url.format(requestUrl), (resp) => {
        let data = '';

        // A chunk of data has been received.
        resp.on('data', (chunk) => {
            console.log("GET chunk: " + chunk);
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("GET end of response: " + data);
        });

    }).on("error", (err) => {
        console.log("GET Error: " + err);
    });
}

ファイルの先頭にある必須モジュールをお見逃しなく:

http = require("http");
url = require('url')

またhttps、セキュリティで保護されたドメインとSSLを介して通信するためにモジュールを使用する場合があることも覚えておいてください。したがって、次の2行が変更されます。

https = require("https");
...
https.get(url.format(requestUrl), (resp) => { ......

-1

サーバーコードと混ぜないのはなぜですか

例 php

<script>
var ip=<?php echo($_SERVER['REMOTE_ADDR']);?>

</script>

-2

MEANJS 0.6.0をexpress@4.16で使用しています。

クライアント:

コントローラ:

var input = { keyword: vm.keyword };
ProductAPi.getOrder(input)

サービス:

this.getOrder = function (input) {return $http.get('/api/order', { params: input });};

サーバ

ルート

app.route('/api/order').get(products.order);

コントローラ

exports.order = function (req, res) {
  var keyword = req.query.keyword
  ...

-3

--------クエリ文字列データへのアクセス-------
これがリンクhttp://webapplog.com/search?term=node.js&page=1であるとします。

だからあなたはエクスプレスで使うことができます:

  • req.query.term
  • req.query.page または
  • req.query(オブジェクト内のクエリをフェッチします)

    //例
    app.get('http://webapplog.com/search?term=node.js&page=1',(req, res)=>{ res.json({term:req.query.term, page:req.query.page}) })

--------へのアクセスURLのパラメータは、-------
これはリンクであると仮定http://webapplog.com/node.js/pages/100
だから、あなたが使用できる表現で: app.get('/:term/pages/:page',....)

  • req.params.term
  • req.params.page

    //例
    app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{ res.json({term:req.params.term, page:req.params.page}) })
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.