egg 项目 yield rray, or object, but the following object was passed: "undefined
发布于 8 年前 作者 Rock-1 4464 次浏览 来自 问答

nodejs.TypeError: You may only yield a function, promise, generator, a rray, or object, but the following object was passed: "undefined 这是什么error

16 回复

yield 就是等… 你没法等一个 undefined 值 你没法叫醒一个装睡的人 这个意思…

@magicdawn 那怎么叫醒呢我着急让他干活

@i5ting 狼叔我这样写的 const user = yield app.mysql.get(‘cpap_user’);

@Rock-1 get的返回类型是什么?

@i5ting 是个array,打印的时候是个undefined,我怀疑是不是我用egg用的不对

@Rock-1 yield后面可以接array,但array里的元素类型是thunk或promise么?让你看文档你就是不看啊

@Rock-1 你egg用得不对

@Rock-1 你配置没配好,导致mysql单例没有加载成功,所以app.mysql是个原始Singleton而不是mysql的实例,原始Singleton带有get这个函数是用于支持多数据库的。所以实际上你是get是触发了获取一个名为cpap_user的mysql实例,而不是mysql实例的get一个table的操作,但是实际上你没有配置多数据库,所以就返回了undefined。 你企图yield 一个undefined,所以报错了

详细见 https://github.com/eggjs/egg/blob/73095e2c04d6493d34061c51272b70d5b6c21aa9/lib/egg.js#L308 还有 https://github.com/eggjs/egg/blob/73095e2c04d6493d34061c51272b70d5b6c21aa9/lib/core/singleton.js#L47

建议贴一下你mysql的配置

@AnzerWall

 exports.mysql = {
  // 单数据库信息配置
  client: {
    // host
    host: '127.0.0.1',
    // 端口号
    port: '3306',
    // 用户名
    user: 'root',
    // 密码
    password: '',
    // 数据库名
    database: 'efang',
  },
  // 所有数据库配置的默认值
  default: {
        database: 'egg_demo'
  },
  // 是否加载到 app 上,默认开启
  app: true,
  // 是否加载到 agent 上,默认关闭
  agent: false,
};


@AnzerWall 这个就是单个数据链接,我看官网上是这样写的

@Rock-1 库和插件版本呢

@AnzerWall “egg-mysql”: “^2.0.0”,

去官方提 issue 吧,最好附上一个最小可复现问题的仓库

https://github.com/eggjs/egg/issues

回到顶部