egg.js实战遇到的一些坑
发布于 8 年前 作者 maochunguang 15962 次浏览 最后一次编辑是 7 年前 来自 分享

说明

本文所有示例基于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"
  }

命令行显示

断点调试

此文章持续更新,欢迎收藏关注

16 回复

@atian25 来点评一下,哈哈

  1. controller写法推荐类的写法,确实是每个写法获取某些属性的方式不同。
  2. 调试可以使用vscode,配置官网已经给出,很方便。
  3. 配置会根据运行环境进行可并,合并后会在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 的优化做完后,就内置了,不需要上面那个插件。
回到顶部