也许这是一个愚蠢的问题,但是我花了很长时间试图解决但无法获取数据。
在下面的函数checkMailCount中,我有一个名为test的对象,其中带有一个函数,用于将值分配给邮件。从res.on('end')分配给此test.mails的值不会通过mailCount保留/持久化。
'use strict';
const https = require('https');
exports.handler = (event, context, callback) => {
let session = event.session;
let request = event.request;
if (request.type === "something") {
if (request.name === "blah blah") {
let emailCount = checkMailCount(session, callback);
context.succeed(callback(null, emailCount));
}
}
function checkMailCount(session, callback) {
let url = 'https://www.googleapis.com/gmail/v1/users/me/messages?
access_token = $ {
session.user.accesstoken
} & q = "is:unread"
';
let test = {
mails: "",
mailCount: function(val) {
this.mails = val;
}
};
let data = "";
https.get(url, function(res) {
res.on('data', function(chunk) {
data += chunk;
//console.log(data);
});
res.on('end', function() {
let result = JSON.parse(data);
//result2+= result.replace('/\//g','');
test.mailCount(result["resultSizeEstimate"]);
// result["resultSizeEstimate"] inaccessible outside
});
});
return test.mails; // This is returning undefined
}
//context.fail();
}
以下是来自gmail API的响应JSON
{
"messages": [
{
"id": "165f1627a53f70c6",
"threadId": "165f000031cee15b"
},
{
"id": "165f00d9e2e07737",
"threadId": "165f00d9e2e07237"
}
],
"nextPageToken": "10349401829330188334",
"resultSizeEstimate": 2
}
我需要从checkMailCount函数返回result [“ resultSizeEstimate”]的值。 result的值result [“ resultSizeEstimate”]在res.on('end',f(){此处可用})内可用,但不在外部。
我不是以lambda的方式在VS代码中尝试此操作,而是可以通过其他方式进行操作。它很难对lambda函数进行单元测试。有没有办法,我可以将电子邮件计数发送到context.succeed(callback(null,emailCount))吗?
答案 0 :(得分:0)
此代码中的回调似乎存在一个基本问题。 checkMailCount
的行为不可能像您希望的那样以其当前形式出现。 checkMailCount
是异步的。 JavaScript有几种不同的方式来处理异步代码。最古老的是您在这里做什么,callbacks。接下来是promises,最后是async/await。如果您切换到异步/等待,则此代码可能更容易编写。就是说,如果您想继续使用回调模式,就必须使用它们。
您应该传递自己的lambda回调,而不要传递给checkMailCount
。
checkMailCount(session, function(err, result) {
// result === result.resultSizeEstimate
// Call your lambda callback from within this function
});
res.on('end', function() {
let result = JSON.parse(data);
test.mailCount(result["resultSizeEstimate"]);
callback(null, result.resultSizeEstimate)
});