我在中間件中做一些復雜的事情時遇到了問題。我知道我應該在路線或一些小功能中完成這項作業,但我別無選擇。
這是整個中間件:
app.use(async function addReqUser(req,res,next) {
if (req.cookies) {
let token = req.cookies['session-token'];
let user = {};
async function verify() {
//google auth function
const ticket = await client.verifyIdToken({
idToken: token,
audience: CLIENT_ID,
});
const payload = ticket.getPayload();
user.name = payload.name;
user.email = payload.email;
user.picture = payload.picture;
}
verify()
.then(async ()=>{
req.user = user;
const user = await User.find({ email: req.user.email }).select("_id").exec();
req.user.id = user[0]._id
res.locals.user = req.user //populate the user with an id
next();
})
.catch(err=>{
console.log(err)
return res.redirect('/')
})
}
next()
})
The error just says [ERR HTTP_HEADERS_SENT] Cannot set headers after they are sent back to the client
幫我解決這個問題。
您的快速回應表示贊賞。
uj5u.com熱心網友回復:
如果req.cookies設定并且verify()呼叫成功,next()將執行兩次:一次在異步呼叫之后verify(),一次在.then函式結束時。
另一方面,如果verify()失敗,函式中的res.redirect呼叫會在第一次執行之后.catch設定一個標頭。next()
兩者都可能導致觀察到的錯誤。中間件應該要么
- 可選擇設定標題,然后呼叫
next()(一次!)或 - 可選擇設定標頭,然后發送回應(例如, via
res.send),但不發送 callnext()。
uj5u.com熱心網友回復:
您還沒有使用過 async 和 await 驗證功能,您可以將您的 app.use 修改為以下代碼
app.use(async function addReqUser(req, res, next) {
if (req.cookies) {
let token = req.cookies['session-token'];
let user;
async function verify() {
//google auth function
return client.verifyIdToken({
idToken: token,
audience: CLIENT_ID,
});
}
const response = await verify()
const payload = response.getPayload()
if (payload.email) {
user.name = payload.name;
user.email = payload.email;
user.picture = payload.picture;
const userDoc = await User.find({ email: req.user.email }).select("_id").exec();
req.user = userDoc;
req.user.id = userDoc[0]._id;
res.locals.user = req.user //populate the user with an id
return next()
} else {
return res.redirect('/')
}
}
next()
})
在驗證時使用 .then 時,代碼不會在首先執行 if 塊后等待 verify() Promise 完成 & next()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/343607.html
標籤:javascript 节点.js 表达 http-代理-中间件
