如何在Node.js上的Express.js中获取GET(查询字符串)变量?


1190

是否可以像$_GET在PHP中一样在Node.js中获取查询字符串中的变量?

我知道在Node.js中,我们可以在请求中获取URL。有没有获取查询字符串参数的方法?


6
@whitequark的答案(得票最多的答案)应标记为正确答案。您是否介意为与遇到相同问题的其他人更新它?
Dev01

在快速请求中使用查询对象-以下是使用快速请求查询的示例
drorw

@ Dev01他自2014
John Balvin Arias 19'July

如果有人在寻找Expressjs和MongoDB的Nodejs API样板。试试这个:github.com/maitraysuthar/rest-api-nodejs-mongodb
Maitray Suthar

Answers:


1177

在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

180
这是可以接受的,但不是首选答案。见下文!使用req.query
Cheeso

2
mikemcneil在下面的回答是一个更好的选择。使用req.queryreq.param(这是不同于req.params...见下文。
MindJuice

9
-1。上面的代码无济于事-好的开发人员会在现场进行重构。这是对“ 如何获取URL的查询字符串? ” 的答案-有问题的URL恰好在名为的对象中request,与Express无关。参见下面的@whitequark的答案(使用request.query
lunohodov

1648

既然您在标记中提到了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);

67
值得一提的是,您应该使用req.query.id,而无需使用括号符号。
alex

要安装Express,请执行以下操作:是| sudo npm install -g express ---我尝试编辑,但Alexis King已恢复。
费利佩

在该问题中,他正在寻找一种获取所有查询字符串参数(如数组)的方法。正确的答案是这样的:app.get('/',function(req,res){console.log(req.query);});
理查德·托卡托

463

在Express中,使用req.query

req.params仅获取路由参数,而不获取查询字符串参数。请参阅快递航行文件:

(req.params)检查路由参数,例如:/ user /:id

(req.query)检查查询字符串参数,例如:?id = 12检查urlencoded主体参数

(req.body),例如:id = 12要使用经过urlencoded的请求正文,req.body应该是一个对象。这可以通过使用_express.bodyParser中间件来完成。

就是说,在大多数情况下,您都希望获得参数的值,而不管其来源如何。在这种情况下,请使用req.param('foo')

无论变量是在路由参数,查询字符串还是编码的请求正文中,都将返回参数的值。

旁注-如果您打算获取所有三种类型的请求参数(类似于PHP $_REQUEST)的交集,则只需将参数合并在一起-这就是我在Sails中设置的方式。请记住,路径/路线参数对象(req.params)具有数组属性,因此顺序很重要(尽管Express 4可能会改变


req.param('STRING')是正确的答案。参见此处:stackoverflow.com/questions/17007997/…(向下滚动至可接受的答案下方)
Joseph Juhnke 2014年

3
@deltab这是req.paramsSails文档中的链接:sailsjs.org / #
documentation

7
req.param在express 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 2016年

142

对于Express.js,您要执行以下操作req.params

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

8
要在express.js中检索GET变量,可以使用req.query。
本·辛克莱

6
@Andy req.params更好,因为:req.param(name [,default])将:如果存在或默认,则返回param name的值。检查路由参数(req.params),例如:/ user /:id检查查询字符串参数(req.query),例如:?id = 12检查urlencoded主体参数(req.body),例如:id = 12要利用urlencoded请求主体,req.body应该是一个对象。这可以通过使用_express.bodyParser中间件来完成。
Cris-O

我不知道req.param是否会检查req.query,谢谢您的注意。
本·辛克莱

3
req.param('parameterName')将检查req.body,req.query和req.params,但是如果要将所有查询参数都作为对象,则应使用req.query。
mikermcneil'2

1
@mikermcneil您可能将req.param()和req.params(对象)混合了。根据expressjs文档,req.param()在所有三个对象中寻找价值。expressjs.com/api.html#req.param
Ben Sinclair

78

我从其他答案中学到了知识,并决定在我的整个网站上使用以下代码:

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

那你就可以打电话

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

获取网址应在哪里

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

2
ID和选项将不会被定义,因为查询只是一个字符串?我们必须使用正则表达式或类似的东西解析出两个单独的参数。
ossek 2014年

1
@ossek相信造成的行为parsereq.url转换为一个对象。
whitfin

1
@ossek,他提供了true作为url.parse的第二个参数,这使查询属性指向一个对象(并且内部使用querystring模块),您可以在docs [here](nodejs.org/docs / latest / api /…
巴拉特(Bharat

工作...。非常感谢!
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方法传递参数

方法1:MVC方法,在其中传递诸如/ routename /:paramname之类的参数,
在这种情况下,您可以使用req.params.paramname来获取参数值。期望将ID作为参数
链接可能像: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)安装快递: 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,还需要一行代码。确保添加“ require http”(第二行)。我在这里发布了一个更完整的示例,展示了此调用的工作方式。运行后,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

很简单:

范例网址:

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 destructuringes6的新功能。


我在节点上使用了express,所以这对我来说效果很好。谢谢!
user752746'9


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

从我的角度来看,我认为许多人将两个不同的概念混在一起。在REST开发期间,我熟悉通过两种方式在URL中传递信息:“路径变量”和“请求参数”(查询参数)。RFC像这样描述URI的各个部分:在此处输入链接描述,所以我了解作者很想知道如何传递请求参数。我只想使该主题更容易理解,但是这里多次提到了该解决方案。

您可以使用来从URI中获取查询参数request.query.<name of the parameter>,第二点提到的解决方案是request.params.<name of the parameter>,并且您可以由此获取路径变量。


0

因此,可以通过两种方式接收此“ id”:1)使用params:代码params看起来类似于:假设我们有一个数组,

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

然后对于参数,我们可以做类似的事情:

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

2)另一种方法是使用查询参数。因此该网址看起来像“ ..... \ 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
var express = require('express');
var app = express();

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

app.listen(3000);

0

如果你需要发送GET请求到IP还有一个Domain(其他的答案并没有提到你可以指定一个port变量),你可以利用这个功能:

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进行通信。因此这两行将发生变化:

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

-1

为什么不与服务器代码混合

例如。的PHP

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

</script>

-2

我在Express@4.16上使用MEANJS 0.6.0,很好

客户:

控制器:

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}) })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.