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

我们可以在Node.js中获取查询字符串中的变量,就像我们在PHP中的$_GET中获取它们一样吗?

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

1704650 次浏览

在Express中,它已经为你完成了,你可以简单地使用req.query

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

否则,在NodeJS中,您可以手动访问req.url和内置url模块url.parse

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

你应该能够做这样的事情:

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")})

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

你想做的Express.jsreq.params

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

在Express中,使用req.query

req.params只获取路由参数,不获取查询字符串参数。请参阅表达留档:

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

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

(req.body),ex: id=12要使用urlencoded请求主体,req.body应该是一个对象。这可以通过使用_express.body解析器中间件来完成。

也就是说,大多数时候,您希望获取参数的值而不管其来源如何。在这种情况下,请使用req.param('foo')。请注意,自Express 4:http://expressjs.com/en/4x/api.html#req.param以来,这已被弃用

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

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

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:东西


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

我从其他答案中吸取了教训,并决定在我的网站中使用此代码:

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

那你就打电话吧

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

获取的URL应该在哪里

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

一个小型Node.jsHTTP服务器侦听端口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,并通过输入“节点parse.js”在控制台上运行它。

它是如此简单:

示例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","actiatekey":"$2a8$jvGevXUOvYxKsiBt.PpMs.zgzD4C/www. tsvjzfUr qL rg S 3 zX J V fV RK"}

要打印具体:

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

产出

ActivateKey:$2a8$$jvGevXUOvYxKsiBt.PpMs.zgzD4C/www TsvjzfUrqLrgS3zXJVfVRK

Whitequark响应很好。但是对于当前版本的Node.js和Express.js,它还需要一行。确保添加“需要超文本传输协议”(第二行)。我在这里发布了一个更完整的示例,展示了这个调用是如何工作的。运行后,在浏览器中输入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'));})

有2种方法通过GET方法传递参数

方法一:在MVC方法中,您可以传递参数,如 /routename/:参数名
在这种情况下,您可以使用req.params.paramname来获取参数值链接可以是: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);
//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"}
})

如果您使用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 testingconst 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)

您可以使用

request.query.<varible-name>;

您可以使用Express^4.15.4:

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

希望这有帮助。

您可以使用url模块收集参数,使用url.parse

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

在Expresjs中,它是由,

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.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...
app.get('/user/:id', function(req, res) {res.send('user' + req.params.id);});

您可以使用它,也可以尝试身体解析器从请求参数中解析特殊元素。

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

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

这就是全部,假设您使用的是es6语法。

PD.{id}代表Object destructuring,一个新的es6特性。

所以,有两种方式可以接收这个“id”:1)使用参数:代码参数看起来像:假设我们有一个数组,

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);});

如果您需要向IPDomain发送GET请求(其他答案没有提到您可以指定port变量),您可以使用此函数:

function getCode(host, port, path, queryString) {console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")
// Construct url and query stringconst requestUrl = url.parse(url.format({protocol: 'http',hostname: host,pathname: path,port: port,query: queryString}));
console.log("(" + host + path + ")" + "Sending GET request")// Send requestconsole.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模块通过安全域和sl进行通信。所以这两行会改变:

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

如果你想避免表达,使用这个例子:

var http = require('http');const url = require('url');
function func111(req, res) {res.writeHead(200, {'Content-Type': 'text/plain'});var q = url.parse(req.url, true);res.end("9999999>>> " + q.query['user_name']);}
http.createServer(func111).listen(3000);

用法:

curl http://localhost:3000?user_name=user1

按yl

这里有很多关于使用request.query访问查询的答案,但是没有人提到它的类型quirk。查询字符串类型可以是字符串或数组,这种类型由用户控制。

例如,使用以下代码:

const express = require("express");const app = express();
app.get("/", function (req, res) {res.send(`Your name is ${(req.query.name || "").length} characters long`);});
app.listen(3000);

请求/?name=bob将返回Your name is 3 characters long,但请求/?name=bob&name=jane将返回Your name is 2 characters long,因为参数现在是数组['bob', 'jane']

Express提供了两种查询解析器:简单和扩展,两者都将为您提供字符串或数组。与其检查方法是否存在可能的副作用或验证类型,我个人认为您应该覆盖解析器以具有一致的类型:所有数组或所有字符串。

const express = require("express");const app = express();
const querystring = require("querystring");
// if asArray=false only the first item with the same name will be returned// if asArray=true all items will be returned as an array (even if they are a single item)const asArray = false;app.set("query parser", (qs) => {const parsed = querystring.parse(qs);return Object.entries(parsed).reduce((previous, [key, value]) => {const isArray = Array.isArray(value);if (!asArray && isArray) {value = value[0];} else if (asArray && !isArray) {value = [value];}
previous[key] = value;return previous;}, {});});
app.get("/", function (req, res) {res.send(`Your name is ${(req.query.name || "").length} characters long`);});
app.listen(3000);

表达特定的简单方法来获取

  1. 查询字符串(在?之后),例如https://...?user=abc&id=123

     var express = require('express');
    var app = express();
    app.get('/', function(req, res){res.send('id: ' + req.query.id);});
    app.listen(3000);
  2. 查询参数,例如https://.../get/users/:id

     var express = require('express');var app = express();
    app.get('/get/users/:id', function(req, res){res.send('id: ' + req.params.id);});
    app.listen(3000);

做喜欢我

npm  query-stringimport queryString from "query-string";
export interface QueryUrl {limit?: number;range?: string;page?: number;filed?: string;embody?: string;q?: string | object;order?: number;sort?: string;
}
let parseUri: QueryUrl = queryString.parse(uri.query);

考虑这个url->/api/endpoint/:id?name=sahil这里id是参数,其中as name是查询。您可以像这样在nodejs中获取此值

app.get('/api/endpoint/:id', (req, res) => {const name = req.query.name; // queryconst id = req.params.id //params});