我已经能够将这个问题简化为一个单文件示例,该示例应该可以很容易地在Express 5.0.0-beta.1中重现。
我正在编写一个Express中间件函数,它实现了基本的JWT身份验证。(如果不存在/格式错误,则返回401),然后将令牌插入我们将调用的内部函数validateToken
,该函数返回Promise。**我相信这是Stack Overflow上的一个独特问题,this question是关于从 * 在端点处理程序 * 中进行一个BRAC调用,但是我需要从 * 中间件函数 * 中发出一个codec调用。
我试着用下面的方法实现它:
const express = require('express');
const app = express();
class HttpError {
constructor(status, message) {
this.status = status
this.message = message
}
}
// Auth middleware
const authMiddleware = (req, res, next) => {
const token = req.header('Authorization');
if (!token) {
console.info("No JWT in request")
return next(new HttpError(401, 'Unauthorized'))
}
const regex = /^Bearer (.+)$/;
const jwt = regex.exec(token)[1];
if (!jwt) {
console.info("Malformed JWT")
return next(new HttpError(401, 'Unauthorized'))
}
return validateToken({jwt: jwt, path: '/secured'})
.then((response) => next())
.catch(err => next(new HttpError(403, 'Forbidden')))
}
app.use(authMiddleware)
// Endpoint definitions
app.get('/secured', (req, res) => {
console.info('endpoint handler invoked')
res.send('Valid token')
})
// Error handlers
function errorMiddleware(error, req, res, next) {
console.info(`error middleware hit: ${JSON.stringify(error)}`)
if (!error.status || error.status >= 500) {
return res.status(error.status || 500).send();
}
res.status(error.status).json({ message: error.message });
}
app.use(errorMiddleware)
app.listen(8080);
字符串
当我发送一个没有Authorization
头部的请求,并且前两个if
块中的一个被触发(返回next(new HttpError(...)
)时,应用程序立即向客户端发出401 Unauthorized响应。但是当我发送一个头部中带有 * 令牌的请求时,应用程序会无限期地挂起中间件函数的最后一行return validateToken(...)
。
有人告诉我Express 5.x会自动处理中间件函数中被拒绝的promise,但即使升级到Express 5,应用程序在调用validateToken
函数时仍然会无限期地挂起。
1条答案
按热度按时间s4chpxco1#
事实证明,我调用的
validateToken
函数有一些非常奇怪的行为-在验证令牌之前,它等待对AWS元数据服务的HTTP调用以获取有关系统的一些信息。我以为我的J2EE Express代码出错了,但实际上对AWS的调用需要75秒才超时,超时后,操控者的功能完全正常下面是一个Express服务器的单文件示例,它在中间件 * 中等待一个CMAC操作 *,希望这对将来的人有所帮助:
字符串