在Express中如何获取URL参数?

434

我在获取localhost:8888/p?tagid=1234中的tagid值时遇到了问题。

请帮我修改控制器代码。我无法获取tagid值。

我的代码如下:

app.js:

var express = require('express'),
  http = require('http'),
  path = require('path');
var app = express();
var controller = require('./controller')({
  app: app
});

// all environments
app.configure(function() {
  app.set('port', process.env.PORT || 8888);
  app.use(express.json());
  app.use(express.urlencoded());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
  app.set('view engine', 'jade');
  app.set('views', __dirname + '/views');
  app.use(app.router);
  app.get('/', function(req, res) {
    res.render('index');
  });
});
http.createServer(app).listen(app.get('port'), function() {
  console.log('Express server listening on port ' + app.get('port'));
});

Controller/index.js:

function controller(params) {
  var app = params.app;
  //var query_string = request.query.query_string;

  app.get('/p?tagId=/', function(request, response) {
    // userId is a parameter in the url request
    response.writeHead(200); // return 200 HTTP OK status
    response.end('You are looking for tagId' + request.route.query.tagId);
  });
}

module.exports = controller;

routes/index.js:

require('./controllers');
/*
 * GET home page.
 */

exports.index = function(req, res) {
  res.render('index', {
    title: 'Express'
  });
};

24
在表达式中,/p?tagid=1234 中的 tagid 被称为查询字符串,而不是 URL 参数。URL 参数应该是 /p/:tagId - mikemaccana
4个回答

1025

Express 4.x

要获取URL参数的值,请使用req.params

app.get('/p/:tagId', function(req, res) {
  res.send("tagId is set to " + req.params.tagId);
});

// GET /p/5
// tagId is set to 5

如果您想获取查询参数?tagId=5,则使用req.query

app.get('/p', function(req, res) {
  res.send("tagId is set to " + req.query.tagId);
});

// GET /p?tagId=5
// tagId is set to 5

Express 3.x

URL参数

app.get('/p/:tagId', function(req, res) {
  res.send("tagId is set to " + req.param("tagId"));
});

// GET /p/5
// tagId is set to 5

查询参数

app.get('/p', function(req, res) {
  res.send("tagId is set to " + req.query("tagId"));
});

// GET /p?tagId=5
// tagId is set to 5

你使用的是哪个版本的Express?我刚在express-3.4.4上测试过,它可以正常工作。 - maček
顶部的解决方案(/p/5)对我来说完美无缺,但底部的/p?tagId=5给我报错"tagId被设置为未定义"。 - user2834795
@user2834795,我不确定你为什么在使用req.param时遇到了困难,我还为你添加了一个req.query的解决方案。 - maček
2
非常感谢你,Macek。你帮我节省了时间。这是我的错误,我按照你的指示做了一切,但在URL中我使用的是“tagid”而不是“tagId”。 - user2834795
12
req.param()已被弃用: 请使用适当的req.params,req.body或req.query。对于命名路由“参数”(例如/p/:tagId),请使用req.params。对于查询字符串(例如/p?tagId=5),请使用req.query - Nateowami
显示剩余4条评论

23

如果您想获取URL中的查询参数值,请按照以下代码片段进行操作

//url.localhost:8888/p?tagid=1234
req.query.tagid
OR
req.param.tagid

如果您想使用Express参数函数获取URL参数

使用Express参数函数来获取特定的参数。这被视为中间件,将在路由调用之前运行。

这可用于验证或获取有关项目的重要信息。

例如:

// parameter middleware that will run before the next routes
app.param('tagid', function(req, res, next, tagid) {

// check if the tagid exists
// do some validations
// add something to the tagid
var modified = tagid+ '123';

// save name to the request
req.tagid= modified;

next();
});

// http://localhost:8080/api/tags/98
app.get('/api/tags/:tagid', function(req, res) {
// the tagid was found and is available in req.tagid
res.send('New tag id ' + req.tagid+ '!');
});

最佳答案。测试通过。 - Cris

23

你可以像这样做:req.param('tagId')


1
该方法已被弃用,请使用req.query代替。 - alextc
8
@alextc,req.queryreq.params是两个非常不同的东西,req.param('x')的替代方法是req.params.x,而不是req.query - Al-Mothafar

17

如果您的路由如下所示,则这将起作用:localhost:8888/p?tagid=1234

var tagId = req.query.tagid;
console.log(tagId); // outputs: 1234
console.log(req.query.tagid); // outputs: 1234
否则,如果你的路由看起来像这样:localhost:8888/p/1234,请使用以下代码。
var tagId = req.params.tagid;
console.log(tagId); // outputs: 1234
console.log(req.params.tagid); // outputs: 1234

5
通常人们不会像这样创建URL:/p/:tagid=1234 - Ankur Loriya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接