GCP Cloud Function从Cloud Storage读取文件

时间:2019-01-21 20:39:43

标签: node.js google-cloud-platform google-cloud-storage google-cloud-functions

我是GCP,云功能和NodeJS生态系统的新手。任何指针都将非常有帮助。

我想编写一个执行以下操作的GCP云功能:

  1. 读取保存在Google Cloud Storage中的文件(sample.txt)的内容。
  2. 将其复制到本地文件系统(或仅将console.log()复制到它)
  3. 在本地使用功能仿真器运行此代码进行测试

结果:500 INTERNAL error with message 'function crashed'。功能日志给出以下消息

2019-01-21T20:24:45.647Z - info: User function triggered, starting execution
2019-01-21T20:24:46.066Z - info: Execution took 861 ms, finished with status: 'crash'

下面是我的代码,主要选自GCP NodeJS示例代码和文档。

exports.list_files = (req, res) => {
    const fs = require('fs');
    const {Storage} = require('@google-cloud/storage');
    const storage = new Storage();
    const bucket = storage.bucket('curl-tests');
    bucket.setUserProject("cf-nodejs");
    const file = bucket.file('sample.txt'); // file has couple of lines of text

    const localFilename = '/Users/<username>/sample_copy.txt';

    file.createReadStream()
        .on('error', function (err) { })
        .on('response', function (response) {
            // Server connected and responded with the specified status and 
headers.
        })  
        .on('end', function () {
            // The file is fully downloaded.
        })  
        .pipe(fs.createWriteStream(localFilename));
}

我这样跑:

functions call list_files --trigger-http 

ExecutionId: 4a722196-d94d-43c8-9151-498a9bb26997
Error: { error:
   { code: 500,
     status: 'INTERNAL',
     message: 'function crashed',
     errors: [ 'socket hang up' ] } }

最终,我希望将证书和密钥保存在存储分区中,并使用它们对GCP之外的服务进行身份验证。这是我要解决的更大问题。但是现在,我们着重解决崩溃问题。

1 个答案:

答案 0 :(得分:2)

使用node(而不是仿真器)在桌面上开始开发和调试。一旦您的代码正常运行而没有警告和错误,则开始使用模拟器,最后使用Cloud Functions。

让我们获取您的代码并修复其中的一部分。

bucket.setUserProject("cf-nodejs");

我怀疑您的项目是cf-nodejs。输入正确的项目ID。

const localFilename = '/Users/<username>/sample_copy.txt';

这行不通。云功能中没有目录/Users/<username>。您可以写入的唯一目录是/tmp。为了进行测试,请将此行更改为:

const localFilename = '/tmp/sample_copy.txt';

您没有为错误做任何事情:

.on('error', function (err) { })

更改此行至少打印一些内容:

.on('error', function (err) { console.log(err); })

然后,您将可以在Google Cloud Console->堆栈驱动程序->日志中查看输出。堆栈驱动程序支持选择“云函数”-“您的函数名称”,以便您可以看到调试输出。

最后,将代码包装在try / except块中,然后将错误消息记录在except块中。这样,当您的程序在云中崩溃时,至少将有一个日志条目。