问题描述
我是 node 的新手,在一个简单的 node+express+googlecal+pug 问题上我的头撞在墙上
- node/express 路由接受请求并调用控制器
- 控制器确保验证身份验证,然后...
- 执行成功的 gcal 函数...console.log 有我需要的数据
- 尝试直接(在控制器函数中)返回“在将标头发送到客户端后无法设置标头”....为什么对 Gcal API 的调用会强制将响应返回给客户端?
- 尝试通过对每个函数的单独调用来使其更微观,结果相同
我在这里遗漏了什么?
getcalendars: async function(oauth2client,res) {
const calendar = google.calendar({ version: "v3",auth: oauth2client });
cal = await calendar.calendarList.list(
{},(err,result) => {
//console.log("HEADERS SENT1?: "+res.headeRSSent);
if (err) {
console.log('The API returned an error: ' + err);
return;
}
console.log(JSON.stringify(result));
message2 = JSON.stringify(result)
res.render('schedules',{message2: message2})
return
});
},
router.route('/dashboard/schedules')
.get(async function(req,res) {
if (req.session.loggedin) {
//x = gcalController.getcalendars(req,res);
token = await gcalController.gettoken(req,res);
isAuth = await gcalController.calauth(token);
listcalendars = await gcalController.getcalendars(isAuth,res);
} else {
res.redirect("/?error=FailedAuthentication")
//res.send('Please login to view this page!');
}
});
解决方法
Can't set headers already sent
在您多次发送响应时发生。通常,您可以通过返回 res.send()
调用来终止该函数。
看起来创建 res
对象的快速中间件在您的 res.render()
被拉出微任务队列时正在发送响应。
你能展示完整的代码吗?似乎这可能源于调用 getcalendars
的范围。