使用egg-init的 simple 模式初始化一个项目
以npm run dev的方式启动,在修改文件后work进程重启,但之后所有的请求被pendding
日志如下:
2017-08-16 12:21:00,512 WARN 12476 [agent:development] reload worker because D:\workSpace\selfPr
o\egg-example2\app\controller\home.js change
2017-08-16 12:21:00,514 INFO 14148 [master] reload workers...
2017-08-16 12:21:00,549 INFO 14148 [master] app_worker#2:5312 start, state: none, current worker
s: ["1","2"]
2017-08-16 12:21:01,897 INFO 14148 [master] app_worker#2:5312 started at 7001, remain 0 (22938ms
)
[Wed Aug 16 2017 12:21:02 GMT+0800 (中国标准时间)] [cfork:master:14148] worker:15808 disconnect
(exitedAfterDisconnect: true, state: disconnected, isDead: false)
[Wed Aug 16 2017 12:21:02 GMT+0800 (中国标准时间)] [cfork:master:14148] don't fork new work (ref
ork: false)
2017-08-16 12:21:02,013 INFO 14148 [master] app_worker#1:15808 disconnect, suicide: true, state:
disconnected, current workers: ["2"]
2017-08-16 12:21:02,013 WARN 12476 [ClusterClient:Connection] socket is closed by other side whi
le there were still unhandled data in the socket buffer
[Wed Aug 16 2017 12:21:02 GMT+0800 (中国标准时间)] [cfork:master:14148] worker:15808 exit (code:
null, exitedAfterDisconnect: true, state: dead, isDead: true, isExpected: true)
在已有issue中搜索发现跟 #684 #1130 很相似,但在重新安装依赖且只用一个work的情况下仍没有解决问题
2017-08-16 12:21:02,013 WARN 12476 [ClusterClient:Connection] socket is closed by other side while there were still unhandled data in the socket buffer
@gxcsoccer 这个 warn 是啥情况会出现?
@leoDreamer 重启后试过 curl 请求么? PS: node 升 8 吧
@atian25 已在8.0的环境下用curl试过,还是有问题,但同样的代码跑在同事电脑上就没问题,
防火墙? 还是其他什么配置? 此类只在某个电脑上复现的问题, 无能为力...
@atian25 今天有空又来探索了这个问题,
首先我在cluster-reload的reset()里打印了firstWorker.state和newWorker.state,从第二次reload开始,每一次更改文件都会打印两次,第一次两个listening,第二次两个dead,这应该是newWorker没有成功启动的原因吧,然后我的更改是在fork newWorker前就把firstWorker kill 掉,然后就解决这个问题了.
不能 kill ,要等待优雅退出。 开发期好像可以.
cc @gxcsoccer
没看懂呢?请求被pedding是指什么?
2017-08-16 12:21:02,013 WARN 12476 [ClusterClient:Connection] socket is closed by other side while there were still unhandled data in the socket buffer
这个就是 app 和 agent 还在数据通信时,app 被 kill 掉,在 agent 上报的错
@atian25 我也和无奈啊,我这边的环境已经和同事一模一样了,但修改代码后还是不能正常reload work,这个开发着很痛苦的.目前这样操作还没有发现有什么副作用.
@gxcsoccer 请求被pendding,可能我描述的不准确,就是当修改代码reload work 后,所有的请求都是pendding状态,而且日志上也没有打印任何东西.
我的也是一样的问题 诶 感觉进了深坑...
@AloneWeb 提供最小可复现方式
和上面的差不多
windows 10
node v8.9.1
2017-11-26 22:55:09,045 WARN 1628 [agent:development] reload worker because F:\MyWeb\Projects\gshop_egg\app\router.js change
[2017-11-26 22:55:09.450] [cfork:master:6924] worker:1164 disconnect (exitedAfterDisconnect: true, state: disconnected, isDead:
false, worker.disableRefork: false)
[2017-11-26 22:55:09.452] [cfork:master:6924] don't fork new work (refork: false)
2017-11-26 22:55:09,452 INFO 6924 [master] app_worker#10:1164 disconnect, suicide: true, state: disconnected, current workers: ["11","12"]
2017-11-26 22:55:09,456 WARN 1628 [ClusterClient:Connection] socket is closed by other side while there were still unhandled data in the socket buffer
@gxcsoccer 会不会是 win 的锅?
关闭了防火墙 重新安装了依赖还是这样

router.get('/user/create', user.create); 这行代码运行不了 只有把这个放在 router.get('/user/:id', user.info); 前面才行
@AloneWeb 不要把不同问题放在一个 issue 里面,很容易被遗漏掉
哦哦
@atian25

Windows 下 reload workers 失效
@leoDreamer @fengmk2
放弃egg的reload,定义一个启动文件,使用nodemon启动,
需要做如下代码处理:
cluster-client/lib/connection.js
_handleSocketError(err) {
// 返回true,不触发任何错误
return true;
this._lastError = err;
if (err.code === 'ECONNRESET') {
this.logger.warn('[ClusterClient:Connection] socket is closed by other side while there were still unhandled data in the socket buffer');
} else {
this.emit('error', err);
}
}
cluster-client/lib/client.js
function reloadWorker(info) {
if (!config.reloadOnDebug) {
return;
}
if (isAssetsDir(info.path) || info.isDirectory) {
return;
}
// don't reload if don't match
if (config.reloadPattern && multimatch(info.path, config.reloadPattern).length === 0) {
return;
}
logger.warn(`[agent:development] reload worker because ${info.path} ${info.event}`);
// 注释掉这部分代码,不刷新worker
// process.send({
// to: 'master',
// action: 'reload-worker',
// });
}
同遇到了这个问题,只有我这台电脑出现
解决方案:换一个端口号 就解决了
好像和电脑里某程序有冲突 被kill掉了