eggjs 执行 start 启动报错
版本
node v18.12.0
egg ^3.17.5
背景
先前执行 yarn start 可以正常启动,今日修改代码再次启动,发现报错,如下图(比较长没有截完)
排查与解决
1. 默认 node 版本16.18.0,vue3 项目要更高的版本,因此导致项目起不来还比较频繁,于是先忽视报错,无脑切 node 版本到 18.12.0,未果
用到16.18.0的场景更多一些,所以一直没有改 nvm 的默认,要用其他版本的时候临时切换
2. 结合报错信息 ERROR 25500 [app_worker] server got error: bind EADDRINUSE null:7001, code: EADDRINUSE,得知地址被占用
3. 在 postman 访问 http://127.0.0.1:7001 的接口,发现可以正常返回,基本能确认就是上次运行的进程没有被终止
4. 执行 lsof -i:7001 查看占用端口的任务,有如下输出,得到 pid
5. 执行 kill 97630,将该进程杀死
6. 再次启动,成功
总结
egg 项目 start 命令作为部署命令,添加了 --deamon 参数,进程将变成守护进程在后台运行,直到系统关机
上次启动之后,没有执行 yarn stop 结束 egg 服务,仅关闭了编辑器,期间也没有关机,就遇到了这个问题
如何避免
本地运行时优选 yarn dev 命令,如果要执行 start 看部署的效果,可以:
1. 将 --deamon 参数去掉,这样关闭终端或关闭编辑器,将自动终止服务(不要提交,会影响部署)
2. 本地运行之后要记着执行 yarn stop 命令,手动终止(算是官方推荐,readme 里可以看到)
3. 本地运行过之后就不管它,今后默认是运行的,如果无法访问再启动(如果不是把本地当成服务器,就没必要,不推荐,且占用资源)
4. 按照提示,添加 --ignore-stderr 命令,忽视启动时的报错(终端会有报错信息,看着有点难受)
感谢您的阅读及指正,让我们一起进步。
欢迎联系我交流:veinyin@gmail.com
作者:yuhui_yin
博客地址:https://www.cnblogs.com/veinyin/
如转载请注明出处。