我在从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
进行调用,正如预期的那样。
我做错了什么?
答案 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
变量轻松调整代码,以便您可以采取不同的操作,而不是重定向到该代码。
让我知道它是怎么回事。