Ошибка EADDRINUSE
(адрес уже используется) сообщает, что в локальной системе уже существует другой процесс, занимающий этот адрес / порт.
Существует пакет npm, называемый find-process , который помогает найти (и закрыть) процесс оккупации.
Вот небольшой демонстрационный код:
const find = require('find-process')
const PORT = 80
find('port', PORT)
.then((list) => {
console.log(`Port "${PORT}" is blocked. Killing blocking applications...`)
const processIds = list.map((item) => item.pid)
processIds.forEach((pid) => process.kill(pid, 10))
})
Я подготовил небольшой образец, который может воспроизвестиEADDRINUSE
ошибка.Если вы запустите следующую программу в двух отдельных терминалах, вы увидите, что первый терминал запустит сервер (на порту «3000»), а второй терминал закроет уже работающий сервер (поскольку он блокирует выполнение второго терминала,EADDRINUSE
):
Пример минимальной работы:
const find = require('find-process')
const http = require('http')
const PORT = 3000
// Handling exceptions
process.on('uncaughtException', (error) => {
if (error.code === 'EADDRINUSE') {
find('port', PORT)
.then((list) => {
const blockingApplication = list[0]
if (blockingApplication) {
console.log(`Port "${PORT}" is blocked by "${blockingApplication.name}".`)
console.log('Shutting down blocking application...')
process.kill(blockingApplication.pid)
// TODO: Restart server
}
})
}
})
// Starting server
const server = http.createServer((request, response) => {
response.writeHead(200, {'Content-Type': 'text/plain'})
response.write('Hello World!')
response.end()
})
server.listen(PORT, () => console.log(`Server running on port "${PORT}"...`))