2017-02-17 61 views
0

所以我發現在對Node.js應用程序做了一些最近的更改之後,服務器在一些請求後停止響應。我想我已經找到了罪魁禍首,但想確認。Node.js異步函數沒有回調塊主線程?

因此,我有一個功能,使用後從文件系統中刪除文件,我真的不在乎從文件刪除的響應,所以我只是忽略它。

所以可以說我有這樣的功能:

removeFileAtPath(filePath, callback) { 
    fs.unlink(filePath, (err) => { 
    if (callback) { 
     return callback(err) 
    } 
    }); 
} 

這會從中間件函數調用,所以通常會被稱爲是這樣的:

uploadFile(req, res, next) { 
    // Do something 
    removeFileAtPath(path, (error) => { 
    if (error) { /* handle error */ } 
    res.send(someResponse) 
    }); 
} 

但因爲我不關心功能反應,我打電話removeFileAtPath這樣的功能:

uploadFile(req, res, next) { 
    // Do something 
    removeFileAtPath(path); // No callback passed in here 
    res.send(someResponse); 
} 

Wi像這樣的東西阻止主循環或者我的問題可能在其他地方?

+2

沒有它不會阻止迴路 –

+1

一切接縫都可以。我認爲這個問題在別的地方。 – dumitru

+0

你是對的,沒有回調的事情不是原因。我顯然在'// Do something'部分泄漏了數據庫連接,如果數據庫連接池耗盡,我發現它會掛起整個節點進程。更多關於我如何在這裏檢測到這個:http://stackoverflow.com/a/42319762/379226 – Inn0vative1

回答

0

嘗試調用next()函數在您的中間件

+0

壞主意,如果你已經調用'res.send(someResponse)' –

0

不,它不會阻止結束 - 如果你指的是主線程和事件循環 - fs.unlinkSync會在這個意義上阻止。

但是您仍然需要確保您返回響應調用下一個中間件 - 否則即使線程和事件循環不會在通常意義上被阻塞,也會「阻止」請求被服務並且您的服務器仍然能夠處理其他請求和事件。