2017-08-06 69 views
4

我使用Firebase数据库为我的android应用程序。我正在使用它的云功能功能。我编写了函数并试图在本地机器上测试它。错误:无法设置标题后,他们被发送firebase云功能

我正在运行此命令来测试它,云功能在firebase服务器上运行良好,不在本地主机上。下面的命令发送错误

firebase serve --only functions

> 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("https://stackoverflow.com/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("https://stackoverflow.com/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); 
     }); 
    }); 
}); 

谁能帮我什么错误?

+0

通常在两次回调调用时发生此错误。检查你的代码是否有错误:'function(err,res){if(err)return ...}'。 –

+0

@AikonMogwai它是在不在本地机器上的Firebase服务器上工作,它有道理吗? –

+0

@AikonMogwai我添加了有问题的代码,你现在可以检查它吗 –

回答

2

这绝对是一个棘手的案例。我认为这里发生了一个复杂的错误事件,错误消息是低于标准的。请注意,有两行代码表示“执行耗时60022毫秒,结束状态:X”。我疯狂的猜测是Cloud Function超时(然后发送响应),但是你的代码继续在后台运行。最终它试图发送真实的响应,但响应已经发送,Express.js抛出异常。

另外,这个云功能正试图在HTTP请求的限制期间在应用程序中加载每个用户。无论Cloud Functions或Firebase实时数据库的速度有多快,如果尝试在恒定的超时时间内进行O(N)操作,您将达到极限。是否可以让你的HTTP函数计算两个用户之间的相似度?或者在后台主动计算并使用户的相似性无效并返回HTTP功能中的缓存值?

相关问题