如何在快速渲染参数上传递gmail消息?

时间:2018-03-30 01:48:07

标签: javascript node.js express passport-google-oauth

我使用passport-google-oauth进行身份验证,使用node-gmail-api来获取Gmail!所以我想在经过身份验证后显示gmail消息,以便我在routes.js

中编码
app.get('/profile', isLoggedIn, function(req, res) {
      var gmail = new Gmail(req.user.google.token)
      , s = gmail.messages('label:inbox', {max: 10}),mm;

    s.on('data', function (d) {
       res.render('profile.ejs', {
            user : req.user, // get the user out of session and pass to template,
            mm: d.snippet,
            layout: 'header'
        });
    })

关于代码可以获取gmail消息,但收到如下错误并停止运行节点服务器

  

错误:发送后无法设置标题       在validateHeader(_http_outgoing.js:494:11)
      在ServerResponse.setHeader(_http_outgoing.js:501:3)
      .....

如果我在res.render函数之外写s.on('data'),我就无法在渲染中传递邮件片段字符串。如何使用node-gmail-api消息正确呈现?

1 个答案:

答案 0 :(得分:0)

我通过@freddy对gitter.im的建议得到了解决,s.on('data')是在获取时的管道/流数据,我得到的第一个结果不一定是最终/最终结果 像Wait for callback of async function in last stream.on('data') event这样的东西应该走上正轨 所以,在尝试运行res.render()之前,我需要等待来自s.on('data')的所有数据完成。

  var data

  stream.on('data', function (d) {
    data = d
  })

  stream.on('end', function () {
    t.equal(data.id, '147dae72a4bab6b4')
    t.equal(data.historyId, '6435511')
    t.equal(data.messages.length, 1)
    t.equal(data.messages[0].snippet, 'This is a test email.')
    t.equal(stream.resultSizeEstimate, 1)
    t.end()
  })
})

在上面的例子中,数据被收集并存储在数据变量中,然后才能在结束流中使用它。stream.on( 'end'是我应该放置 res.render 的地方,如下所示。 ..

app.get('/profile', isLoggedIn, function(req, res) {
      var gmail = new Gmail(req.user.google.token)
      , s = gmail.messages('label:inbox', {max: 10}),data;

    s.on('data', function (d) {
       data = d;
    })
    s.on('end', function () {
      res.render('profile.ejs', {
            user : req.user, // get the user out of session and pass to template,
            mm: data.snippet,
            layout: 'header'
        });
    });