2017-02-17 2 views
0

Итак, я заметил, что после внесения некоторых изменений в мое приложение Node.js сервер перестает отвечать на запросы после некоторых запросов. Я думаю, что я прибил преступника, но хочу подтвердить.Node.js async функция без обратного вызова блокирует основной поток?

Таким образом, у меня есть функция, которая удаляет файл из файловой системы после использования, я действительно не забочусь об ответе от удаления файла, поэтому я просто игнорирую его.

Так позволяет сказать, что у меня есть эта функция:

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 ll что-то вроде этого блока основного цикла или моя проблема, вероятно, где-то в другом месте?

+2

Нет, он не будет блокировать петлю –

+1

Все швы в порядке. Я думаю, что проблема в другом месте. – dumitru

+0

Вы правы, ни одна проблема обратного вызова не была причиной. Я, по-видимому, просачивал соединение с базой данных в части '// Do something', которую я нашел, зависает весь процесс узла, если пул подключений базы данных исчерпан. Подробнее о том, как я обнаружил это в этом здесь: http://stackoverflow.com/a/42319762/379226 – Inn0vative1

ответ

0

Попытка вызвать следующую функцию() в конце вашего промежуточного

+0

Плохая идея, если вы уже вызвали 'res.send (someResponse)' –

0

Нет, он не блокирует - если вы имеете в виду основной поток и цикл событий - fs.unlinkSync будет блокировать в этом смысле.

Но вам все же необходимо убедиться, что вы ответите или, назовите следующее промежуточное ПО - в противном случае вы «заблокируете» запрос от обслуживания, хотя поток и цикл событий не будут блокироваться в обычном смысле и ваш сервер все равно сможет обрабатывать другие запросы и события.

Смежные вопросы