说明
本文所有示例基于async function,node版本node>=7.6
controller和service的两种写法:基于类和普通方法
这两种写法在获取全局变量有些地方不一样,这里列举最常见的几个全局变量的异同。 关于内置对象得详细介绍,参考官方文档 内置对象介绍
- 基于类的controller
module.exports = app => {
class User extends app.Controller {
async queryUser() {
// logger获取,request对象获取
app.logger.info(this.ctx.request.body)
// 全局配置文件获取
const domain = app.config.domain
let users = []
try {
// 全局插件获取
users = await app.model.user.find({})
// service获取
await this.ctx.service.user.find({})
} catch (e) {
app.logger.error(e)
}
// 获取body
this.ctx.body = {
users,
}
// 重定向写法
this.ctx.redirect('http://www.baidu.com')
// render 模版引擎,
this.ctx.body = app.nunjucks.render('register.nj')
}
return User
}
- 基于普通方法(exports)
exports.register = async function register() {
// logger获取,request对象获取
this.logger.info(this.request.body)
try {
// 全局配置文件获取
const domain = this.app.config.domain
// service获取
await this.service.register.register(this.token, this.request.body)
// 全局插件获取
const users = await this.app.model.user.find({})
this.service.message.send()
} catch (e) {
this.logger.error(e)
}
// 获取body
this.body = { 'success' }
// 重定向写法
this.redirect('http://www.baidu.com')
// render 模版引擎,
this.body = this.app.nunjucks.render('success.nj', data)
}
自定义配置文件
egg.js的配置文件非常人性化,有config.default.js,config.default.prod.js,config.test.js等等。 运行时根据环境变量加载不同的配置文件。默认时config.default.js,指定环境变量后会把config.env.js(对应环境)的配置文件和config.default.js合并。
调试代码
由于使用了async await,调试起来有些麻烦,建议使用webstorm或者chrome进行调试,eggjs自带egg-bin,支持在chrome里进行调试,对async,await有良好的支持。
使用chrome调试,配置如下:
在package.json中添加script,使用npm run debug
启动,复制链接在chrome中打开,
"scripts": {
"start": "node index.js",
"debug": "egg-bin debug"
}
此文章持续更新,欢迎收藏关注
@atian25 来点评一下,哈哈
- controller写法推荐类的写法,确实是每个写法获取某些属性的方式不同。
- 调试可以使用vscode,配置官网已经给出,很方便。
- 配置会根据运行环境进行可并,合并后会在run目录下存储最后运行时的配置文件,如果出错了,可以先看看配置文件对不对。
@a304885433 vscode对inspect协议还不够完善把,我感觉用chrome更方便一些,就是每次重启url会变
@maochunguang 我一直用的vscode调试的 觉得很好用。应用和unittest都没问题
@a304885433 可以把你的vscode debug配置文件发一下,我调试一下,放到文章里,方便大家使用
目前新版 VSCode 在调试这块有 Bug,正确的姿势是,在 shell 窗口启动程序,然后在 VSCode 进行 attach worker,不要在 VSCode 里面 launch egg。
@okoala 好的,晚上写到文章里
只能点赞了。
有一篇新的文档可以看看:「框架内置基础对象」 https://eggjs.org/zh-cn/basics/objects.html
@atian25 这个官方文档得赞一个,讲得很明白!
死马哥哥出品
npm run debug后,并没有chrome devtools的url
@soneway 你的chrome版本看看,应该必须56+
@soneway 看文档,需要连接 debugport
chrome devtools 的 url 在 chrome 新版本已经没了,几种解决方式:
- 访问
chrome://inspect
点击那个Open dedicated DevTools for Node
- 如果你用 egg-development-proxyworker 插件的话,会有输出
- 等我最近一个 egg-bin 的优化做完后,就内置了,不需要上面那个插件。
@a304885433 正解