Express 中的查询参数

Query parameters in Express

我正在尝试在 Node.js 中使用 Express 访问查询参数。出于某种原因,req.params 一直作为空对象出现。这是我在 server.js:

中的代码
const express    = require('express');
const exphbs     = require('express-handlebars');
const bodyParser = require('body-parser');
const https      = require('https');

//custom packages  ..
//const config  = require('./config');
const routes  = require('./routes/routes');


const port = process.env.port || 3000;


var app = express();

//templating engine Handlebars
app.engine('handlebars', exphbs({defaultLayout: 'main'}));
app.set('view engine', 'handlebars');





//connect public route
app.use(express.static(__dirname + '/public/'));


app.use(bodyParser.json());

//connect routes
app.use('/', routes);






app.listen(port,  () => {
    console.log( 'Server is up and running on ' + port );
});

这是我的路线文件:

//updated
const routes = require('express').Router();


routes.get('/', (req, res) => {
  res.render('home');
});



routes.post('/scan',  (req, res) => {
    res.status(200);

    res.send("hello");
});



routes.get('/scanned',  (req, res) => {

    const orderID = req.params;
    console.log( req );

    res.render('home', {
        orderID
    });
});

module.exports = routes;

当服务器启动并且 运行 时,我正在导航至 http://localhost:3000/scanned?orderid=234。我目前在 routes.js 文件中的控制台日志显示一个空体(无法识别 URL 中的 orderid 参数)。

请求中的

orderid为查询参数。它需要通过 req.query 对象而不是 req.params 来访问。使用以下代码访问请求中传递的 orderid

const orderID = req.query.orderid

现在您应该能够获得请求中传递的 234 值 url。

或尝试将路线 /scanned 的代码替换为以下内容:

routes.get('/scanned',  (req, res) => {

  const orderID = req.query.orderid
  console.log( orderID ); // Outputs 234 for the sample request shared in question.

  res.render('home', {
    orderID
  });
});

req.body 一直作为空对象出现的原因是在 get 请求中,例如浏览器在导航时发出的请求,没有正文对象。在 get 请求中,查询字符串包含您尝试访问的 orderid。查询字符串附加到 url。您的代码可以重写如下:

routes.get('/scanned',  (req, res) => {

    const orderID = req.query.orderid
    console.log( req );

    res.render('home', {
        orderID
    });
});

但请注意,如果您的客户端代码中有 AJAX 个帖子触发,您的 req.body 将不会为空,您可以像往常一样解析它。