Node.js 错误:Can';t在firebase cloud函数中发送头后设置头

Node.js 错误:Can';t在firebase cloud函数中发送头后设置头,node.js,firebase,firebase-realtime-database,firebase-tools,Node.js,Firebase,Firebase Realtime Database,Firebase Tools,我正在为我的android应用程序使用Firebase数据库。我正在使用它的云功能特性。我编写了一些函数,并试图在本地机器上进行测试 我运行这个命令是为了测试它,云功能在firebase服务器上运行良好,而不是在本地主机上。下面的命令发送一个错误 firebase仅提供功能 代码: 有谁能帮我出什么问题吗?这绝对是个棘手的问题。我认为这里发生了一个复杂的错误案例,错误信息不符合标准。注意,有两行写着“执行耗时60022毫秒,完成状态:X”。我的猜测是云函数超时(然后发送响应),但您的代码继续在后

我正在为我的android应用程序使用
Firebase
数据库。我正在使用它的云功能特性。我编写了一些函数,并试图在本地机器上进行测试

我运行这个命令是为了测试它,云功能在firebase服务器上运行良好,而不是在本地主机上。下面的命令发送一个错误

firebase仅提供功能

代码:


有谁能帮我出什么问题吗?

这绝对是个棘手的问题。我认为这里发生了一个复杂的错误案例,错误信息不符合标准。注意,有两行写着“执行耗时60022毫秒,完成状态:X”。我的猜测是云函数超时(然后发送响应),但您的代码继续在后台运行。最终,它尝试发送真正的响应,但响应已经发送,并且Express.js抛出了一个异常


另一方面,此云函数试图在HTTP请求的限制期间加载应用程序中的每个用户。无论云功能或Firebase实时数据库的速度有多快,如果您试图在恒定的超时时间内适应O(N)操作,您都会达到一个极限。可以让HTTP函数计算两个用户之间的相似性吗?或者主动计算用户在后台的相似度并使其无效,并在HTTP函数中返回缓存值?

通常,此错误发生在两次回调调用中。检查您的代码是否有错误:
函数(err,res){if(err)return…}
@AikonMogwai它在firebase服务器上工作,而不是在本地计算机上,有意义吗?@AikonMogwai我添加了有问题的代码,您现在可以检查吗?我看不到任何错误处理。没有它们的代码总是有奇怪的行为。在这种情况下,我认为您没有连接到firebase(检查连接参数),并且
df.ref
被浪费了。此错误意味着您在关闭响应后正在写入响应。在您的情况下,您似乎多次调用
response.send(jsonResponse)
。也可以在这里看到我的答案:。我必须承认,我并没有立即看到您多次调用
send()
> firebase serve --only functions

=== Serving from 'D:\Firebase'...

i  functions: Preparing to emulate HTTPS functions. Support for other event types coming soon.
Warning: You're using Node.js v7.10.0 but Google Cloud Functions only supports v6.11.1.
Server#addProtoService is deprecated. Use addService instead
+  functions: getUsers: http://localhost:5002/xyz/us-central1/getUsers
info: User function triggered, starting execution
info: Execution took 60022 ms, finished with status: 'timeout'
info: Execution took 60022 ms, finished with status: 'crash'
Error: Can't set headers after they are sent.
    at ServerResponse.setHeader (_http_outgoing.js:371:11)
    at ServerResponse.header (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\express\lib\response.js:730:10)
    at ServerResponse.send (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\express\lib\response.js:256:15)
    at ProxyServer.Supervisor._proxy.on (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\@google-cloud\functions-emulator\src\supervisor\supervisor.js:97:12)
    at ProxyServer.emit (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\eventemitter3\index.js:144:27)
    at ClientRequest.proxyError (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\http-proxy\lib\http-proxy\passes\web-incoming.js:156:18)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:191:7)
    at Socket.socketErrorListener (_http_client.js:358:9)
info: Execution took 60054 ms, finished with status: 'crash'
Error: Can't set headers after they are sent.
    at ServerResponse.setHeader (_http_outgoing.js:371:11)
    at ServerResponse.header (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\express\lib\response.js:730:10)
    at ServerResponse.send (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\express\lib\response.js:256:15)
    at ProxyServer.Supervisor._proxy.on (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\@google-cloud\functions-emulator\src\supervisor\supervisor.js:97:12)
    at ProxyServer.emit (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\eventemitter3\index.js:144:27)
    at ClientRequest.proxyError (C:\Users\williams\AppData\Roaming\npm\node_modules\firebase-tools\node_modules\http-proxy\lib\http-proxy\passes\web-incoming.js:156:18)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:191:7)
    at Socket.socketCloseListener (_http_client.js:334:9)
exports.getUsers = functions.https.onRequest((request, response) => {
  var x = [],
    similarityCount;

  db
    .ref("/users/" + request.query.userId)
    .once("value")
    .then(function(snapshot) {
      var jsonObject = snapshot.val();
      var basicProfileJsonObject = jsonObject.basicProfile;
      for (var key in basicProfileJsonObject) {
        if (utils.isNumber(basicProfileJsonObject[key])) {
          x.push(basicProfileJsonObject[key]);
        }
      }
      db.ref("/users/").once("value").then(function(snapshot) {
        var y = [];
        var jsonResponse = [];
        snapshot.forEach(function(item) {
          var user = item.val();
          let userId = user.basicProfile.userId;
          if (userId !== request.query.userId) {
            var basicProfileJsonObject = user.basicProfile;
            for (var key in basicProfileJsonObject) {
              if (utils.isNumber(basicProfileJsonObject[key])) {
                y.push(basicProfileJsonObject[key]);
              }
            }

            if (request.query.algo === "cosine") {
              // compute cosine value
              similarityCount = cosineUtils.cosineSimilarity(x, y);
            } else if (request.query.algo == "euclidean") {
              // compute euclidean distance value
              similarityCount = 1 / (1 + euclidean(x, y));
            } else if (request.query.algo === "pearson-correlation") {
              // compute pearson correlation coefficents
              similarityCount = pcorr.pearsonCorrelation(x, y);
            }
            console.log("------------------------------------");
            console.log(x);
            console.log("------------------------------------");
            console.log("------------------------------------");
            console.log(y);
            console.log("------------------------------------");
            console.log("------------------------------------");
            console.log(similarityCount);
            console.log("------------------------------------");
            jsonResponse.push(item.val());
            y = [];
          }
        });
        response.send(jsonResponse);
      });
    });
});