2014-03-19 57 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, []); 
}