目前为止,所有的node项目都是基于egg这个框架上的框架开发的,egg有一些必须有的配置和结构。在开发过程的三个项目中,做到第二个项目时,对于类似的项目,一些项目初始的必要工作是相似的。从model到service,在到controller.甚至router的代码可以根据数据表进行创建。并不是说他能解决所有问题,但是node开发者能够结合自己独有的业务进行扩展,提高自己的开发效率。
基于sequelize-auto(后面简称auto)
项目是基于auto改造的,这个包的功能是自动生成与数据库相对应的model.而我的想法是既然可以生成model那么一定可以生成controller.service
auto的主要源码结构如下:
— bin
— sequelize-auto(执行脚本)
— lib
— index.js
— index.js
— package.json
bin—》sequelize-auto
这个主要是执行脚本,解析参数,调用封装的AutoSequelize对象以及其方法。
lib—》index.js
这个才是主要的内容,封装的AutoSequlize 对象,我改造的主要地方是该对象的write方法<br />
function createFile(table, _callback) {
var fileName = self.options.camelCaseForFileName ? _.camelCase(table) : table;
<!--下面两行是我添加的-->
// 调用模板渲染 fileRender 要添加的文件
const render = fileRender({name:fileName});
// 将模板渲染的内容输入到指定文件中
fs.writeFile(path.resolve(__dirname,`../bin/service/${fileName}.js`),render);
fs.writeFile(path.resolve(path.join(self.options.directory, fileName + (self.options.typescript ? '.ts' : '.js'))), attributes[table], _callback);
}
lib—》 fileRender(源码没有,自己添加)
该文件是执行渲染部分,内容如下<br />
``` const nunjucks = require(‘nunjucks’); const path = require(“path”);
// 暂时只渲染{{}}}的内容 module.exports = function (data) { nunjucks.configure(path.resolve(__dirname, ‘../bin’), { autoescape: true }) return nunjucks.render(‘serviceModel.js’, data); }
- bin--》serviceModel(源码没有,自己添加)
执行的service层代码模板,我举了以下的例子<br />
‘use strict’;
const Service = require(‘egg’).Service; const Sequelize = require(‘sequelize’); const Op = Sequelize.Op;
class {{name}}Service extends Service {
// 查询{{name}}列表
async list(params, transaction = null) {
const {
ctx,
app
} = this;
const result = await app.model.{{name}}}.findAndCountAll(option);
return result;
return res;
}
// 修改操作
async update(params, transaction = null) {
const {
ctx,
app
} = this;
const res = await app.model.{{name}}}.update(params, {
where: {
id: params.id
},
transaction
});
return res;
}
}
module.exports = {{name}}Service;
```
基于这个尝试,那么可以根据代码生成代码。
之后我将其做成前后分离的模式。用于页面选择操作生辰代码。链接