如何在 Express 中向 req.url 添加查询字符串?

Nas*_*tro 4 javascript node.js express

我想req.url在 Express 中向 a 添加一个字符串。字符串如下所示:

?id=someID&product=bag
Run Code Online (Sandbox Code Playgroud)

我无权访问客户端 html 或服务器。我从客户那里得到的只是一个GET没有任何参数的请求。所以我尝试制作中间件,它会添加查询字符串,然后我会像往常一样解析它。这个想法是:

// Middleware

const addQuery = (req, res, next) => {
    req.url = req.url + `?id=someID&product=bag`;
    next();
}
Run Code Online (Sandbox Code Playgroud)

然后在请求处理程序中:

router.get('/', addQuery, (req, res) => {
    console.log(req.query.id);
    console.log(req.query.product);
});
Run Code Online (Sandbox Code Playgroud)

但它给了我undefined。我不能使用任何客户端js,也不能使用服务器端编码。不是我origin向我发送这个请求。

那么如何添加查询字符串来表达请求然后成功解析呢?

rob*_*lep 7

express似乎导出了一个称为query它用于解析查询字符串的中间件。因为这个中间件通常在请求流的早期被调用,所以添加查询字符串req.url“太晚了”。

这是一个似乎有效的解决方法:

const addQuery = (req, res, next) => {
  req.url   = req.url + `?id=someID&product=bag`;
  req.query = null; // if this isn't added, the `query` middleware
                    // will assume the query string is already parsed
  next();
}

app.get('/', addQuery, express.query(), (req, res) => {
  ...
});
Run Code Online (Sandbox Code Playgroud)

编辑:正如@wlh 正确建议的那样,addQuery也可以req.query直接修改:

const addQuery = (req, res, next) => {
  req.query.id      = 'someID';
  req.query.product = 'bag';
  next();
}
Run Code Online (Sandbox Code Playgroud)

这应该几乎相同,但更干净。

  • 出于好奇,他难道不能只更新中间件中的 req.query 对象吗?`req.query={id: 'someID', product: 'bag"}` (2认同)