节点JS内存泄漏?

时间:2014-03-19 09:00:57

标签: node.js express

我在Express(v3.4.8)上运行了一个Node应用程序(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.');
      }
    });
  });
},

返回的数组如下所示:

[ { PRODUCTID: '7',
    PRODUCTNAME: 'Token 1',
    QTY: '500',
    PRICE: '5',
    AVAILABLE: '1',
    PRODUCTTYPE: '1',
    BILLINGDEALNAME: 'Token 1' },
  { PRODUCTID: '8',
    PRODUCTNAME: 'Token 2',
    QTY: '1000',
    PRICE: '9',
    AVAILABLE: '1',
    PRODUCTTYPE: '1',
    BILLINGDEALNAME: 'Token 2' },
  { PRODUCTID: '9',
    PRODUCTNAME: 'Token 3',
    QTY: '2000',
    PRICE: '16',
    AVAILABLE: '1',
    PRODUCTTYPE: '1',
    BILLINGDEALNAME: 'Token 3' },
  { PRODUCTID: '5',
    PRODUCTNAME: 'Token - Free',
    QTY: '500',
    PRICE: '0',
    AVAILABLE: '0',
    PRODUCTTYPE: '0',
    BILLINGDEALNAME: 'Token - Free Token Use' },
  { PRODUCTID: '6',
    PRODUCTNAME: 'Token - Prepaid',
    QTY: '500',
    PRICE: '0',
    AVAILABLE: '0',
    PRODUCTTYPE: '0',
    BILLINGDEALNAME: 'Token - Prepaid Token Use' } ]

我知道这不是大量的信息,但这就是我的全部。如果我强制路由在响应中返回一个空数组,那就没问题了。我不知道在哪里可以看。

帮助?!

更新

我稍微调整了代码以进行调试。三元运算符已被抛弃:

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, []);
}

3 个答案:

答案 0 :(得分:1)

对于我的具体问题,至关重要的是,将Express.js从3.4.x降级到3.3.x.因为这是一个生产系统,所以我无法使用它来获得对所发生情况的更复杂的理解,而且我从未能够在我的下游环境中重现这一点。

只是想为以后可能会搜索的人关闭它。

答案 1 :(得分:0)

尝试最新版本的nodejs - 0.10.26 - 我在0.8.x版本的节点js中有类似的问题

答案 2 :(得分:0)

可能你可以使用流媒体作为回应

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