处理express中的端口占用问题
使用 Promise 设置 error和listening 事件监听,失败后进行延时重试
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('Hello World!')
})
const listen = (port) => {
return new Promise((resolve, reject) => {
const server = app.listen(port)
const duration = 2000 // 重试间隔
let left = 5 // 重试次数
let showErrMsg = true
server.on('listening', () => {
resolve(`app listening at http://localhost:${port}`)
})
server.on('error', (error) => {
if (error.code !== 'EADDRINUSE') { // 系统非监听端口操作报错
throw error
}
left = left - 1
if (showErrMsg) {
console.log(`port ${port} already in use`)
showErrMsg = false
}
console.log(`trying to restart the service on port ${port}... attempts left ${left} `)
if (left !== 0) {
setTimeout(() => server.listen(port), duration)
} else {
reject('Server is shutting down')
}
})
})
}
const port = 9000
async function main () {
try {
const result = await listen(port)
console.log(result)
} catch (error) {
console.log(error)
}
}
main()