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

How to get GET (query string) variables in Express.js on Node.js?

我们能在node.js中获取查询字符串中的变量吗,就像在php中获取$_GET中的变量一样?

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


由于您在标记中提到了express.js,这里有一个特定于express的答案:use req.query。例如。

1
2
3
4
5
6
7
8
var express = require('express');
var app = express();

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

app.listen(3000);


在Express中,它已经为您完成了,您只需使用req.query:

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

否则,在nodejs中,您可以访问req.url和内置的url模块到[url.parse](https://nodejs.org/api/url.html url url parse urlsting parsequerystring u slashespointehost)手动:

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


在Express中,使用req.query

req.params只获取路由参数,不获取查询字符串参数。请参阅Express或帆文档:

(req.params) Checks route params, ex: /user/:id

(req.query) Checks query string params, ex: ?id=12 Checks urlencoded body params

(req.body), ex: id=12 To utilize urlencoded request bodies, req.body should be an object. This can be done by using the _express.bodyParser middleware.

也就是说,大多数情况下,无论参数的来源如何,您都希望得到它的值。在这种情况下,使用req.param('foo')

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

侧注-如果您的目标是获得所有三种类型的请求参数的交集(类似于PHP的$_REQUEST),您只需要将这些参数合并在一起-下面是我在SAILS中设置它的方法。请记住,路径/路由参数对象(req.params具有数组属性,因此顺序很重要(尽管在Express 4中可能会发生更改)。


对于express.js,您希望执行req.params

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


我从其他答案中学习并决定在我的站点中使用此代码:

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

然后你可以打电话

1
2
var id = query.id;
var option = query.option;

GET的URL应该在哪里

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


1
2
3
4
5
6
7
8
9
10
11
//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"}

})

您应该能够这样做:

1
2
3
4
5
6
7
8
9
10
11
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")
})

如果您使用的是ES6和Express,请尝试此destructuring方法:

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

在上下文中:

1
2
3
4
5
6
7
8
const express = require('express');
const app = express();

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

app.listen(3000);

您也可以在destructuring中使用默认值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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)


有两种方法可以通过get方法传递参数

方法1:传递参数的MVC方法,如/routename/:paramname
在这种情况下,您可以使用req.params.paramname来获取参数值,例如,请参阅下面的代码,其中我希望ID作为参数
链接可能如下:http://myhost.com/items/23

1
2
3
4
5
6
7
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:常规方法:使用'?'将变量作为查询字符串传递操作员< BR>例如,请参阅下面的代码,其中我期望ID作为查询参数
链接可以是:http://myhost.com/items?ID=23

1
2
3
4
5
6
7
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);


更新时间:2014年5月4日

保留旧答案:https://gist.github.com/stefek99/b10ed037d2a4a323d638

1)安装快捷:npm install express

App.JS

1
2
3
4
5
6
7
8
9
10
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)运行app:node app.js

3)在浏览器中访问:http://localhost:3000/endpoint?id=something

I have received the ID: something

(自从我的答案以来,很多事情都发生了变化,我相信这值得保持最新的信息)


在端口9080上侦听、解析get或post数据并将其作为响应的一部分发送回客户端的small node.js HTTP服务器是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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在控制台上运行。


白夸克的反应很好。但是对于node.js和express.js的当前版本,它还需要一行代码。确保添加"需要HTTP"(第二行)。我在这里发布了一个更完整的示例,说明这个调用如何工作。运行后,在浏览器中键入http://localhost:8080/?name=abel&fruit=apple,您将根据代码得到一个很酷的响应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 + '
');
  res.write('fruit: ' + req.query.fruit + '
');
  res.write('query: ' + req.query + '
');
  queryStuff = JSON.stringify(req.query);
  res.end('That\'s all folks'  + '
' + queryStuff);
});

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

这很简单:

示例网址:

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

可以使用以下方法打印查询字符串的所有值:

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

产量

All query strings : {"id":"3","activatekey":"$2a$08$jvGevXUOvYxKsiBt.PpMs.zgzD4C/wwTsvjz
fUrqLrgS3zXJVfVRK"}

打印特定:

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

产量

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


您可以使用Express ^4.15.4:

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

希望这有帮助。


你可以使用

1
request.query.<varible-name>;

express.js中,您可以很容易地得到它,您在控制器功能中需要做的就是:

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

仅此而已,假设您使用ES6语法。

钯。{id}代表Object destructuring,这是一个新的ES6特性。


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

您可以使用它,也可以尝试使用body解析器来解析请求参数中的特殊元素。


从我的观点来看,我认为许多人混合了两个不同的概念。在REST开发期间,我熟悉使用"路径变量"和"请求参数"(查询参数)两种方式在URL中传递信息。RFC这样描述了URI的各个部分:在这里输入链接描述,这样我就了解了作者想知道如何传递请求参数。我只想让这个话题更容易理解,但这里已经多次提到了解决方案。

您可以使用request.query.从uri中获取查询参数,第二个解决方案是request.params.,通过这个可以获得路径变量。


可以使用url模块通过url.parse收集参数。

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

在ExpressJ中,

1
var id = req.query.id;

如:

1
2
3
4
5
6
7
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
});


我用meanjs 0.6.0和[email protected],很好

客户:

控制器:

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

服务:

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

服务器

路线

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

控制器

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

在Express中,我们可以简单地使用req.query.。它的工作原理与PHP中的$_GET['name']相同。


--------访问查询字符串数据-------假设这是链接http://webapplog.com/search?term=node.js&page=1

因此,在Express中,您可以使用:

  • req.query.term
  • req.query.page
  • req.query(它将在对象中提取查询)
    BR/>[例证] BR/>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因此,在Express中,您可以使用:app.get('/:term/pages/:page',....)

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

    [例证] BR/>app.get('http://webapplog.com/:term/pages/:page',(req, res)=>{
    res.json({term:req.params.term, page:req.params.page})
    })