我在开发环境下使用 egg-bin dev ,但是发现很多报错都没有在终端打印出来,所以egg是把原本应该输出到终端的错误信息都吞掉了吗?然后给了我一个 Internal Server Error,很神奇
[eggjs/egg]egg-bin dev 把错误都给吞掉了?
回答
不会的。最好是把代码 show 出来,看一下报错信息是怎么打印的呢?
如果是用 logger 打印的,排查一下日志级别设置 如果是用 debug() 打印的,排查一下启动时有没有打开相应环境变量。(可以debug=* egg-bin dev 显示所有信息)
如果是用 console.log 或者 console.error,肯定会直接打印出来的
如果是返回结果没有堆栈信息,可能是环境变量被设置成了非 local 和 unittest (参考:https://github.com/eggjs/egg-onerror/pull/30)
排查一下 config 里的 onerror 设置。(参考:https://eggjs.org/zh-cn/core/error-handling.html#%E6%A1%86%E6%9E%B6%E5%B1%82%E7%BB%9F%E4%B8%80%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86)
@Jeff-Tian 谢谢,你说得没错,如果是直接在代码里面 console.log 肯定是能打印出来的,然而遇到异常却没有打印,我写一个很简单的demo
接口文件如下 app/controller/staff.js
async postAccount () {
let a = b + 1
this.ctx.body = 'ok'
}
很明显这里的 b 没有定义,会抛出错误,正常使用express之类的框架,在开发环境中是能在终端中看到错误信息输出的,然而npm run dev 没有显示任何错误信息,访问该接口只是返回了 Internal Server Error。
我的 package.json
"dev": "EGG_SERVER_ENV=dev debug=* egg-bin dev"
config/config.defualt.js 文件里面没有任何有关日志的配置信息。
@Jeff-Tian 卧槽,感谢,原来我把开发环境设置成了 dev,改成下面即可
"dev": "EGG_SERVER_ENV=local debug=* egg-bin dev"
所以只能设置成 local,没发现文档里面有讲这个
我的 package.json
"dev": "EGG_SERVER_ENV=dev debug=* egg-bin dev"
config/config.defualt.js 文件里面没有任何有关日志的配置信息。
这里设置了 EGG_SERVER_ENV=dev,导致框架启动时认为是生产环境,所以隐藏了错误信息。
在这个PR 被 https://github.com/eggjs/egg-onerror/pull/30 合并前,需要设置 EGG_SERVER_ENV 为 local
为啥要手动设置 env 呢
@Jeff-Tian 感谢
为啥要手动设置 env 呢
@atian25 他这个场景可能并不需要手动设置 env,但是对于我们有多个环境的场景:
dev test stage prod的确需要对开发机器设置 env 为dev,这种情况下我们希望接口报错包含错误堆栈信息,有什么办法么?
这几个环境都应该是线上的服务器了吧,分别对应于开发服,测试服,预发服,正式服。线上服务器为啥要看控制台输出?不都是 egg-scripts 看日志么。
可以看下 egg-onerror 相关源码,如果有配置就按需开启,如果没有,那可以自己在前面加个 try catch 拦截处理错误
开发服相对没那么稳定,每次都要登日志平台不够直接,也不是每个开发都有权限进日志平台,对于没有try catch 的异常,还是挺希望能够直接把错误堆栈显示出来的。
获取 Outlook for Androidhttps://aka.ms/ghei36
From: TZ | 天猪 notifications@github.com Sent: Tuesday, September 10, 2019 11:04:21 PM To: eggjs/egg egg@noreply.github.com Cc: Jeff jeff.tian@outlook.com; Mention mention@noreply.github.com Subject: Re: [eggjs/egg] egg-bin dev 把错误都给吞掉了? (#3897)
可以看下 egg-onerror 相关源码,如果有配置就按需开启,如果没有,那可以自己在前面加个 try catch 拦截处理错误
― You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/eggjs/egg/issues/3897?email_source=notifications&email_token=AAZWHDCU3ZXXF6PMYMBQR6LQI6ZPLA5CNFSM4IOSKP62YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD6LNKZA#issuecomment-529978724, or mute the threadhttps://github.com/notifications/unsubscribe-auth/AAZWHDDSHGNB4C5STJCOE4DQI6ZPLANCNFSM4IOSKP6Q.
都没权限登陆日志平台了,怎么就有权限 ssh 到服务器了?很奇怪。
对于没有try catch 的异常,还是挺希望能够直接把错误堆栈显示出来的。
我指的是自己加个 middleware,把错误提前处理了,打印出来,不要依赖 egg-onerror 的兜底。
都没权限登陆日志平台了,怎么就有权限 ssh 到服务器了?很奇怪。
是的,更没有权限 ssh 到服务器。可能是我借楼提问,导致误解了。
我也不是要看控制台输出,而是说接口报错时返回 500 时,直接在 response 里把错误堆栈带上(就像 local 时一样)。目前由于 dev 也被认为成是生产环境,导致 response 里没有。(我觉得“线上” 并不一定等于 "生产“,dev 只有内网可以访问,并不对外公开)
我指的是自己加个 middleware,把错误提前处理了,打印出来,不要依赖 egg-onerror 的兜底。
这个方案也行,谢谢解答。