在express中剥离特定的查询参数

时间:2018-02-09 09:06:47

标签: node.js express url

我在从express中的请求中剥离特定查询参数时遇到一些困难。问题在于,在正常流程中,用户将从第三方获取承载令牌,然后将其与每个请求一起发送到我的REST API。解码令牌并将用户的ID添加到请求中。

我希望能够在开发模式下将用户的ID附加为查询参数,这样我就可以使用cURL或Postman之类的东西测试API,而无需编写某种脚本来获取每次都是令牌。

为此,我创建了一个单独的中间件,用于开发,它将从查询字符串中取出ID,将其删除,然后重定向到新的URL。我修改了this answer来执行此操作。

this.app.use((req, res, next) => {
    const id = req.query.id;
    req.user = { id };
    let basePath = url.parse(req.url).pathname;
    const queryKeys = Object.keys(req.query);
    if(queryKeys.length === 0) return res.status(400).send('no id attached');
    if(queryKeys.length === 1 && queryKeys[0] === 'id') return next();
    basePath += '?';
    queryKeys.forEach(queryKey => {
       if(basePath[basePath.length -1] !== '?') basePath += '&';
       if(queryKey !== 'id') basePath += `${queryKey}=${req.query[queryKey]}`
    });
    return res.redirect(basePath);
})

如果我只使用ID参数(例如:http://localhost:5000/api/?id=someid)测试它,此函数可以正常工作,但如果我添加第二个参数(例如:http://localhost:5000/api/?id=someid&skip=1),我会得到一条带有消息的404 / is not a recognized path.。从console.log()语句我可以看到,在第二个示例中,res.redirect()正在使用/?skip=1进行调用,正如预期的那样。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解您要执行的操作,因为您似乎在没有id查询参数的情况下重定向到相同的网址,这会返回400错误。

在任何情况下,请查看此代码段,该代码段正确删除id查询参数并执行重定向。

const url = require('url');
app.use((req, res, next) => {
  // return early if the id query parameter is not present
  if (!req.query.id) {
    return res.status(400).send('No id attached.');
  }

  // rebuild URL by removing the id query parameter
  const baseUrl = url.format({
    protocol: req.protocol,
    host: req.get('host'),
  });
  const myUrl = new url.URL(req.originalUrl, baseUrl);
  myUrl.searchParams.delete('id');
  const cleanUrl = `${myUrl.pathname}${myUrl.search}`;

  // redirecting to the URL without the id parameter will return a 400
  return res.redirect(cleanUrl);
});

您可以使用cleanUrl变量轻松调整代码,以便您可以采取不同的操作,而不是重定向到该代码。

让我知道它是怎么回事。