title: Error: Can't set headers after they are sent in firebase cloud function
body: <p>I am using <code>Firebase</code> database for my android application. I am using cloud functions feature of it. I have coded functions and trying to test it on local machine.</p>
  
  <p>I am running this command to test it, cloud functions works well on firebase server not on localhost. Below commands sends an error </p>
  
  <blockquote>
    <p>firebase serve --only functions</p>
  </blockquote>
  
  <pre><code>&gt; 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)
  </code></pre>
  
  <p>Code:</p>
  
  <pre><code>exports.getUsers = functions.https.onRequest((request, response) =&gt; {
    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);
        });
      });
  });
  </code></pre>
  
  <p>Can anyone help me what is going wrong ?</p>