Google drive api 谷歌驱动API承诺不';从AWS Lambda函数调用时根本不返回(但在本地工作正常)

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

我们正在调用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客户端的参数

{
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之前,日志记录已被记录(在函数返回后)。谢谢:-)