为什么我的所有firebase云功能都超时?

时间:2017-09-22 21:35:59

标签: express firebase google-cloud-functions

我正在尝试使用firebase云功能来创建外部json api的代理。但是现在我只想设置它。

我写了这个函数:

exports.helloWorld = functions.https.onRequest((request, response) => {
  request.get('http://www.google.com', function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log(body) // Print the google web page.
    }
  })
});

然后我运行firebase函数模拟器并运行

curl http://localhost:5000/<project-id>/us-central1/helloWorld

它返回一条消息,说明该函数已被触发,开始执行,但它只是坐在那里旋转直到最终超时。

{"error":{"code":500,"status":"INTERNAL","message":"function execution attempt timed out"}}

我不确定我做错了什么。

........

修改

此功能完美无缺:

exports.helloWorld = functions.https.onRequest((request, response) => {
  response.send('test');
})

2 个答案:

答案 0 :(得分:7)

使用云功能,HTTPS类型功能必须将结果写入客户端以指示功能已完成执行。在写入结果之前,假定该函数仍在运行异步工作。

因此,当您的请求完成后,您应该发送一些回复,即使它是空的。不幸的是,您已将主要response对象与另一个对象隐藏起来,因此您可能应该重命名其中一个:

exports.helloWorld = functions.https.onRequest((request, response) => {
  request.get('http://www.google.com', function (error, res, body) {
    if (!error && res.statusCode == 200) {
      console.log(body) // Print the google web page.
    }
    return response.send("") // this terminates the function
  })
})

答案 1 :(得分:4)

HTTPS功能无法完成,直到您在响应中发送内容为止。这是一个将代理请求中的内容作为输出进行管道传输的示例(我必须更改变量名称以避免出现阴影:

exports.helloWorld = functions.https.onRequest((req, res) => {
  request.get('http://www.google.com', function (error, response, body) {
    if (!error && response.statusCode == 200) {
      return res.send(body) // Print the google web page.
    }
    return res.send('ERROR: ' + error.message);
  })
});