管理 Gcal Response + express 和 header 问题

问题描述

我是 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 的范围。