在egg框架下,app文件夹中新建model来创建Service服务对数据库单个表的CURD操作,然后在Service文件夹中引用model中的文件写对多个表进行操作,问题如下:
发布于 5 个月前 作者 black-giser 1370 次浏览 来自 问答

在service层文件中调用自定义的model文件夹下的car.js 如下: this.ctx.model.car.list() 然后在测试时返回错误是car is undefined。 求解我这样理解错在哪里了,有什么推荐的解决方案呢? Thanks in advance!

17 回复

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建文件,不加载的

回到顶部