我们可以在Node.js中获取查询字符串中的变量吗,就像在PHP中获取$_get中的变量一样?
我知道在Node.js中,我们可以获取请求中的URL。是否有获取查询字符串参数的方法?
我们可以在Node.js中获取查询字符串中的变量吗,就像在PHP中获取$_get中的变量一样?
我知道在Node.js中,我们可以获取请求中的URL。是否有获取查询字符串参数的方法?
当前回答
这里有很多关于使用request.query访问查询的答案,但是没有人提到它的类型怪癖。查询字符串类型可以是字符串或数组,此类型由用户控制。
例如,使用以下代码:
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将返回您的姓名长3个字符,但请求/?name=bob&name=jane将返回您的名字有2个字符长,因为参数现在是一个数组['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);
其他回答
//get query¶ms 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"}
})
在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;
因此,有两种方式可以接收此“id”: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);
});
如果您想避免表达,请使用以下示例:
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
app.get('/user/:id', function(req, res) {
res.send('user' + req.params.id);
});
您可以使用这个,也可以尝试使用主体解析器来解析请求参数中的特殊元素。