我是GCP,云功能和NodeJS生态系统的新手。任何指针都将非常有帮助。
我想编写一个执行以下操作的GCP云功能:
结果: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之外的服务进行身份验证。这是我要解决的更大问题。但是现在,我们着重解决崩溃问题。
答案 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块中。这样,当您的程序在云中崩溃时,至少将有一个日志条目。