Node.js 节点JS内存泄漏?

Node.js 节点JS内存泄漏?,node.js,express,Node.js,Express,我有一个在Express(v3.4.8)上运行的节点应用程序(v0.8.26)。在那个应用程序中,我有一个路由,它在响应体中发送一个对象数组。我发现这样做会立即开始提高节点内存使用率,很快一切都会关闭。我有点绝望了,所以我希望有人能(尽快)帮助我 这是我的路线: get_products: function(req, res) { var san = req.params.san; // Authenticate and then retrieve client.login(dat

我有一个在Express(v3.4.8)上运行的节点应用程序(v0.8.26)。在那个应用程序中,我有一个路由,它在响应体中发送一个对象数组。我发现这样做会立即开始提高节点内存使用率,很快一切都会关闭。我有点绝望了,所以我希望有人能(尽快)帮助我

这是我的路线:

get_products: function(req, res) {
  var san = req.params.san;

  // Authenticate and then retrieve
  client.login(datasources.api.auth.sourceId, datasources.api.auth.password, function(err, authToken) {
    if (err) {
      return res.send(401, err);
    }

    client.getProducts(token, san, function(err, products) {
      if (err) {
        var httpStatus = err.httpStatus || 500;

        if (httpStatus === 500) {
          console.trace(err);
        }

        return res.send(httpStatus, err.message);
      }

      if (products) {
        return products.length > 0
          ? res.send(200, products)  // <--- ERROR OCCURS HERE
          : res.send(200, []);
      }
      else {
        return res.send(403, 'Purchase is not allowed at this time.');
      }
    });
  });
},
我知道这不是很多信息,但这是我所有的。如果我强制路由在响应中返回一个空数组,则没有问题。我不知道还能去哪里找

救命啊

更新

为了调试,我稍微调整了代码。三元运算符已被删除:

if (products.length > 0) {
  //return res.send(200, []);
  console.error('RETURNING PRODUCTS');
  console.error(products);
  // return res.send(200, []);

  return res.send(200, products);
}
else {
  return res.send(200, []);
}

试试最新版本的nodejs-0.10.26-我在0.8.x版本的nodejs中遇到了类似的问题

至少对于我的具体问题来说,关键是从3.4.x降级到3.3.x。因为这是一个生产系统,我无法使用它来获得对正在发生的事情的更复杂的理解,而且我从来没有能够在我的下游环境中复制它


只是想为以后可能要搜索的任何人关闭此窗口。

也许您可以使用流媒体作为响应

if (products.length > 0) {
  res.statusCode = 200;
  products.map(res.write);
  res.end();
}
else {
  return res.send(200, []);
}

你能试试
res.json(200,产品);返回?现在尝试一下,但我想不出有什么原因会有任何不同。您认为它可以做什么?与其返回方法
res.send
,不如调用该方法并使用
return
终止,有时在异步调用中,它会在回调中继续执行代码。。我想这可能是问题所在。嗯,很有趣。奇怪的是,在响应体中发送一个空数组是可行的,但填充的数组却失败了。此外,该方法中实际上没有任何其他代码可执行。运气不好。看着节点内存上升…不幸的是,我不能这么做。我必须通过TLS连接到API。节点v0.10.26使用API服务器无法协商的较新版本的TLS。
if (products.length > 0) {
  res.statusCode = 200;
  products.map(res.write);
  res.end();
}
else {
  return res.send(200, []);
}