thinkjs / thinkjs

Use full ES2015+ features to develop Node.js applications, Support TypeScript.
https://thinkjs.org/
MIT License
5.31k stars 617 forks source link

是不是BUG?!使用pm2 在cluster模式下 Error: PREVENT_NEXT_PROCESS #507

Closed flftfqwxf closed 7 years ago

flftfqwxf commented 7 years ago

DESC

在使用pm2 的cluster模式或在thinkjs中开启cluster情况下,使用官方示例以下代码:

indexAction() { let error = new Error("not found"); //将错误信息写到 http 对象上,用于模版里显示 this.http.error = error; return think.statusAction(404, this.http); }

则会报错误 :

0|www-dev | Error: PREVENT_NEXT_PROCESS 0|www-dev | at Object.think.prevent (/Users/leixianhua/project/ironhide-frontend/web/node_modules/thinkjs/src/core/think.js:425:13) 0|www-dev | at _class.end (/Users/leixianhua/project/ironhide-frontend/web/node_modules/thinkjs/src/controller/base.js:318:18) 0|www-dev | at /Users/leixianhua/project/ironhide-frontend/web/src/common/controller/error.js:39:12 0|www-dev | at tryCatcher (/Users/leixianhua/project/ironhide-frontend/web/node_modules/bluebird/js/release/util.js:16:23) 0|www-dev | at Promise._settlePromiseFromHandler (/Users/leixianhua/project/ironhide-frontend/web/node_modules/bluebird/js/release/promise.js:502:31) 0|www-dev | at Promise._settlePromise (/Users/leixianhua/project/ironhide-frontend/web/node_modules/bluebird/js/release/promise.js:559:18) 0|www-dev | at Promise._settlePromise0 (/Users/leixianhua/project/ironhide-frontend/web/node_modules/bluebird/js/release/promise.js:604:10) 0|www-dev | at Promise._settlePromises (/Users/leixianhua/project/ironhide-frontend/web/node_modules/bluebird/js/release/promise.js:683:18) 0|www-dev | at Async._drainQueue (/Users/leixianhua/project/ironhide-frontend/web/node_modules/bluebird/js/release/async.js:138:16) 0|www-dev | at Async._drainQueues (/Users/leixianhua/project/ironhide-frontend/web/node_modules/bluebird/js/release/async.js:148:10) 0|www-dev | at Immediate.Async.drainQueues [as _onImmediate] (/Users/leixianhua/project/ironhide-frontend/web/node_modules/bluebird/js/release/async.js:17:14)

在不使用cluster模式下不会报错

官方说明中:

PREVENT_NEXT_PROCESS

在调用有些方法后(如:success)后会发现有个 message 为 PREVENT_NEXT_PROCESS 的错误。这个错误是 ThinkJS 为了阻止后续执行添加的,如果要在 catch 里判断是否是该错误,可以通过 think.isPrevent 方法来判断。如:

module.exports = think.controller({ indexAction(self){ return self.getData().then(function(data){ return self.success(data); }).catch(function(err){ //忽略 PREVENT_NEXT_PROCESS 错误 if(think.isPrevent(err)){ return; } console.log(err.stack); }) } })

但代码修改为:

let error = new Error("not found"); //将错误信息写到 http 对象上,用于模版里显示 this.http.error = error; try { return think.statusAction(404, this.http).catch((err)=>{ return ; }); } catch (e) { return ; }

依然还是有错误,请问是否有办法解决此类问题

ENV

Platform: mac ubuntu Node.js Version: v4.4.4 ThinkJS Version: v2.2.12

flftfqwxf commented 7 years ago

没人遇到过这个问题?

jerrybendy commented 7 years ago

遇到同样的问题,正准备提 BUG 呢,就发现你提的这个了

welefen commented 7 years ago

我们查下这个问题,不过这个问题不影响程序的执行

jerrybendy commented 7 years ago

@welefen 是的,目前是不影响运行的,只是会生成大片的错误日志

airyland commented 7 years ago

前阵子更新 pm2 后遇到过,很奇怪的是把 pm2 降级到某个版本就不会提示了。。

flftfqwxf commented 7 years ago

@welefen 确实不影响运行,只是在生产环境上确实不利于找问题,而且错误日志会越来越大,希望能解决,谢谢

welefen commented 7 years ago

恩 我们追查下

ckken commented 7 years ago

hurry up

Ivorzk commented 7 years ago

目前我也遇到这个问题了,希望能解决

welefen commented 7 years ago

已经修复,请更新到 2.2.18 版本