在service层文件中调用自定义的model文件夹下的car.js 如下: this.ctx.model.car.list() 然后在测试时返回错误是car is undefined。 求解我这样理解错在哪里了,有什么推荐的解决方案呢? Thanks in advance!
this.ctx.model.Car 大写
@reezon 还是不可以的 改了后它就提示Car is undefined
@reezon 文件结构如下 —>controller —>service ----->car.js
const data = this.ctx.model.Car.list();
—>model ----->car.js
const CarModel extends Service {
list()
{
let result = await runSQL();
...
return result.rows;
}
}
module.export = CarModel;
—>router
应该async list()吧
来自酷炫的 CNodeMD
你的model的写法有问题。 既然CarModel extends Service,那么应该是这么调用:
this.ctx.service.CarModel.list()
而且list为
async list ()
@liuzhiguo11 这个加了也是一样的,然后我尝试了以下这种想法: 在Model中的car.js修改:
let list = async function() {
let result = await runSQL();
...
return result.rows;
}
module.export= {
list:list
}
这种方式调用也是同样的结果: Cannot read property ’ Car ’ of undefined.
关于model目录的用法,在http://eggjs.org/zh-cn/basics/structure.html里这么写的:
app/model/** 用于放置领域模型,可选,由领域类相关插件约定,如 egg-sequelize。
不是egg原生自带model目录的
@reezon 我就想自己封装一些简单的数据库查询操作对其调用,还有之前你说的那个调用方式 this.ctx.service.CarModel.list不符合调用规范的吧 应该是
this.ctx.{dirName}.{fileName}.{functionName}
这样的吧。
egg框架只加载那些默认的目录到ctx上,如果想把其它目录加载到app上,请参考:https://eggjs.org/zh-cn/advanced/loader.html 中的 loadToApp一节
在egg-sequelize的源码中,也是这么来绑定model目录下的模型的
const modelDir = path.join(app.baseDir, 'app/model');
app.loader.loadToApp(modelDir, MODELS, {
inject: app,
caseStyle: 'upper',
ignore: 'index.js',
});
@reezon 就是那么奇怪.
/*----------app.js---------*/
const path = require('path');
moude.exports = app =>{
const dir = path.join(app.baseDir,'/app/models');
app.loader.loadToApp(dir,'service');
}
/* service中的调用model中的car.js */
const data = this.ctx.model.car.list();
返回错误还是这玩意: cannot read property ‘car’ of undefined.
@black-giser loadToApp
是挂到 app 上的,你想类似 model 就要 loadToContext
,并且不要用 service 这个 key
对的,楼上已经说了,model不是自动加载的需要自己写loader,可以参考下egg-sequelize,用到loaderToApp这个API,可以直接在app.js中写
来自酷炫的 CNodeMD
@atian25 @liuzhiguo11 是的,我使用loadToContext可以解决这个问题的啦。之所以错误的原因是因为上面在调用的时候出现了张冠李戴。谢谢啦 node U~
把自定义的文件移到sercver的一个文件夹下就可以了,别自己在ctx建文件,不加载的
app.model.Car
哈哈 我来了