从我的expressJS应用程序内部,我必须验证cookie令牌对于后端服务器是否有效。因此,涉及的相关代码如下:
app.get('*', (req, res, next) => {
console.log('GET: ' + req.path);
// ...
const payload = JSON.stringify({ authnToken: token });
const opts = { ... authServerOptions };
opts.headers['Content-Length'] = payload.length;
// build request
const restReq = https.request(authServerOptions, result => {
console.log('back-end response' + result.statusCode);
result.on('data', data => {
next(); // token is good now proceed.
});
result.on('error', error => {
res.redirect('somewhere'); // token is bad or timeout
});
});
restReq.write(token);
restReq.end();
}
因此,mainget
函数将REST请求设置为活动状态,然后仅返回而无需调用next()
或执行任何操作。
问题:
在此先感谢您的帮助。我没有找到此代码模式的许多示例,因此,如果有一个链接,将不胜感激。
是的,我认为您实施的总体思路是正确的。
我也建议,如注释中所述,使用axios之类的客户端以不太冗长和更全面的方式处理请求,这会使您的代码看起来像这样:
const axios = require('axios');
app.get('*', (req, res, next) => {
const payload = JSON.stringify({ authnToken: token });
const opts = { ... authServerOptions };
opts.headers['Content-Length'] = payload.length;
axios.post(url, payload, opts)
.then(response => next())
.catch(error => {
console.error(error);
res.redirect('somewhere');
});
});
一点,但功能上几乎等同于您的实现。您缺少的一件事是请求对象的onerror回调,该回调当前可能会失败,并且永远不会如您正确怀疑的那样返回响应。您应该添加:
restReq.on('error', error => {
console.error(error);
res.redirect('somewhere');
});
同样,调用next
result可能更合适end
,而不是在读取响应数据时这样做:
result.on('end', () => {
next();
});
然后,您将可以保证将调用回调。
这两种实现都不会阻止对未来请求的处理,因为在两种情况下对令牌验证服务的调用都是异步进行的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句