Google drive api 谷歌驱动API承诺不';从AWS Lambda函数调用时根本不返回(但在本地工作正常)
我们正在调用Google驱动器API v3(具有OAuth2授权)来列出驱动器上的文件。当从我的Mac本地运行时,这很好,但是如果该函数部署到AWS Lambda并从那里调用,调用就永远不会返回。我期望一个承诺能够解决或者拒绝,但这个承诺永远不会回来,不会在。然后或者。抓住或者。最后 本地和Lambda中传递给调用的参数完全相同。我能看到的唯一区别是Lambda在节点10.17上运行,而本地运行在节点10.15上。 编辑:我已在本地更新到节点10.17-问题仍然存在 当我深入查看API代码时,API最终会调用一个公共的apirest.js文件,该文件调用GoogleOAuth2 client.request()方法。在本地和Lambda中,参数也是相同的。此client.request()调用返回一个承诺,该承诺不会解析或拒绝Lambda。在本地运行时,它会按预期进行解析 下面是传递给OAuth2客户端的参数Google drive api 谷歌驱动API承诺不';从AWS Lambda函数调用时根本不返回(但在本地工作正常),google-drive-api,Google Drive Api,我们正在调用Google驱动器API v3(具有OAuth2授权)来列出驱动器上的文件。当从我的Mac本地运行时,这很好,但是如果该函数部署到AWS Lambda并从那里调用,调用就永远不会返回。我期望一个承诺能够解决或者拒绝,但这个承诺永远不会回来,不会在。然后或者。抓住或者。最后 本地和Lambda中传递给调用的参数完全相同。我能看到的唯一区别是Lambda在节点10.17上运行,而本地运行在节点10.15上。 编辑:我已在本地更新到节点10.17-问题仍然存在 当我深入查看API代码时,A
{
url: 'https://www.googleapis.com/drive/v3/files',
method: 'GET',
paramsSerializer: [Function],
headers:
{
'x-goog-api-client': 'gdcl/3.1.1 gl-node/10.17.0',
'Accept-Encoding': 'gzip',
'User-Agent': 'google-api-nodejs-client/3.1.1 (gzip)'
},
params:
{
pageSize: 200,
fields: 'nextPageToken, files(name, id, parents)',
q:
'mimeType="application/vnd.google-apps.folder" and trashed=false',
supportsAllDrives: true,
supportsTeamDrives: true,
includeItemsFromAllDrives: true,
driveId: '0AOWo32MbqS8pUk9PVA',
corpora: 'drive'
},
validateStatus: [Function],
retry: true
}
欢迎提供任何帮助、提示或想法:-)
谢谢
编辑
下面添加了调用api的代码
return new Promise((resolve, reject) => {
try {
return googleDrive.files.list(
{
pageSize: 200,
fields: 'nextPageToken, files(name, id, parents)',
q: 'mimeType="application/vnd.google-apps.folder" and trashed=false',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
driveId: config.googleDrive.sharedDriveId,
corpora: 'drive',
},
(err, results) => {
if (err) {
reject(`Drive error: ${err.message}`);
}
// Go through all results and do stuff ......
resolve({
driveFolders: results,
});
}
);
} catch (error) {
logger.error('Error while calling google drive list: ' + error.message);
}
});
在Lambda函数中运行代码时,您将一无所获,因为它不会等待您的响应,并且会保持同步运行 将Lamda函数的语法更改为
async/await
way,以便能够运行Lamda异步。然后尝试以下代码:
//使用异步语法,您可以等待响应的到来
module.exports.init=异步函数(){
//在调用API之前,按常规执行oAuth进程
const drive=google.drive({version:'v3',oauth2Client});
//注意我是如何等待回应的
const pro2=等待等待结果(驱动器);
控制台日志(pro2);
}
//此函数将执行承诺流,然后返回值
//从承诺到init函数
函数waitForResult(驱动器){
返回新承诺((解决、拒绝)=>{
试一试{
返回drive.files.list(
{
页面大小:10
},
(错误,结果)=>{
if(err)拒绝(`Drive error:${err.message}`);
决心(结果);
})
}捕获(错误){
console.log(错误);
}
});
}
通知
这是我构建的一个测试函数,请尝试它,然后当您对语法感到满意时,根据您的代码调整它
文件
查看这些文档以了解更多信息:
让我知道它是否有效。在Lambda函数中运行代码时,您将一无所获,因为它不会等待您的响应,并且会保持同步运行 将Lamda函数的语法更改为
async/await
way,以便能够运行Lamda异步。然后尝试以下代码:
//使用异步语法,您可以等待响应的到来
module.exports.init=异步函数(){
//在调用API之前,按常规执行oAuth进程
const drive=google.drive({version:'v3',oauth2Client});
//注意我是如何等待回应的
const pro2=等待等待结果(驱动器);
控制台日志(pro2);
}
//此函数将执行承诺流,然后返回值
//从promise到init函数
函数waitForResult(驱动器){
返回新承诺((解决、拒绝)=>{
试一试{
返回drive.files.list(
{
页面大小:10
},
(错误,结果)=>{
if(err)拒绝(`Drive error:${err.message}`);
决心(结果);
})
}捕获(错误){
console.log(错误);
}
});
}
通知
这是我构建的一个测试函数,请尝试它,然后当您对语法感到满意时,根据您的代码调整它
文件
查看这些文档以了解更多信息:
让我知道它是否有效。能否提供Lambda函数中使用的代码?这将有助于解决问题。@albertovielma我已经添加了实际调用,thx您能提供Lambda函数中使用的代码吗?这将有助于解决问题。@albertovielma我已经添加了实际呼叫,谢谢。你说得对。lambda仍在继续,但我们不等待响应。在本地,仍然记录了预期的响应,但在lambda之前,日志记录已被记录(在函数返回后)。谢谢:-)谢谢你。你说得对。lambda仍在继续,但我们不等待响应。在本地,仍然记录了预期的响应,但在lambda之前,日志记录已被记录(在函数返回后)。谢谢:-)