我目前正在设计oauth登录系统,并且遇到了以下问题。我试图将用户登录并设置了会话数据后将其重定向回首页,但是res.redirect('/')
会抛出NodeError: Cannot set headers after they are sent to the client
。我似乎无法使其正常工作。下面是导致故障的代码:
app.post(
"/auth/openid/return",
passport.authenticate("azuread-openidconnect", {
failureRedirect: "/login"
}),
function(req, res) {
let userProperties = req.user;
new Promise((resolve, reject) => {
MongoClient.connect(url, function(err, db) {
if (err) next(err);
let dbo = db.db("Lektier");
let query = {
oid: req.user.oid
};
dbo.collection("users").findOne(query, function(err, result) {
db.close();
if (result) {
let type = result.type;
resolve(type);
}
});
});
}).then(type => {
req.session.regenerate(function() {
req.session.user = userProperties.upn;
if (type == "teacher") {
req.session.teacheruser = userProperties.upn;
}
let names = userProperties.displayName.toString().split(" ");
req.session.FirstName = names[0];
req.session.LastName = names[1];
res.redirect("/");
});
});
}
);
在此问题上的一些帮助将不胜感激。
答案 0 :(得分:0)
每当您看到类似Cannot set headers after they are sent to the client
的消息时,这意味着端点的逻辑试图向客户端发送响应并失败,因为它实际上已经响应了。 express的res.redirect()
实际上会向客户端发送一些3xx http状态,如果您说此方法引发了您所面临的错误,则它已经发送了响应。
我没有发现任何可以响应您提供的代码片段的代码(除了res.redirect()之外),因此我建议您研究一下中间件。例如,在这里提到了护照认证。