我使用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
消息正确呈现?
答案 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'
});
});