2014-03-19 61 views
0

我有一个运行在Express(v3.4.8)上的Node应用程序(v0.8.26)。在那个应用程序中,我有一个在响应主体中发送对象数组的路由。我发现,立即开始启动节点内存使用,不久之后所有内容都会关闭。我有点绝望,所以我希望有人能够帮助(快速)。节点JS内存泄漏?

这里是我的路线:

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' } ] 

我知道这不是一吨的信息,但它是我的一切。如果我强制路由在响应中返回空数组,则没有问题。我不知道还有什么可以看的。

帮助?

UPDATE

我稍微调整了代码进行调试。三元运营商已经抛弃:

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

你可以试试'res.json(200产品);返回;'? – Gntem

+0

立即尝试,但我无法想出一个原因,这将有任何不同的行为。你觉得它可能做什么? –

+0

而不是返回一个'res.send'方法,你最好调用方法并使用'return'来终止,有时在异步调用中它会继续在回调中执行代码..我可能是这里的问题。 – Gntem

回答

1

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

只是想关闭这个为任何人谁可能以后搜索。

0

尝试最新的的NodeJS版 - 0.10.26 - 我在0.8.4版本的NodeJS similiar问题

+0

不幸的是,我不能那样做。我必须通过TLS连接到API。节点v0.10.26使用API​​服务器无法协商的更新版本的TLS。 –

0

也许你可以使用流媒体响应

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