目前为止,所有的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

    1. 这个主要是执行脚本,解析参数,调用封装的AutoSequelize对象以及其方法。
  • lib—》index.js

    1. 这个才是主要的内容,封装的AutoSequlize 对象,我改造的主要地方是该对象的write方法<br />
  1. function createFile(table, _callback) {
  2. var fileName = self.options.camelCaseForFileName ? _.camelCase(table) : table;
  3. <!--下面两行是我添加的-->
  4. // 调用模板渲染 fileRender 要添加的文件
  5. const render = fileRender({name:fileName});
  6. // 将模板渲染的内容输入到指定文件中
  7. fs.writeFile(path.resolve(__dirname,`../bin/service/${fileName}.js`),render);
  8. fs.writeFile(path.resolve(path.join(self.options.directory, fileName + (self.options.typescript ? '.ts' : '.js'))), attributes[table], _callback);
  9. }
  • lib—》 fileRender(源码没有,自己添加)

    1. 该文件是执行渲染部分,内容如下<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); }

  1. - bin--》serviceModel(源码没有,自己添加)
  2. 执行的service层代码模板,我举了以下的例子<br />

‘use strict’;

const Service = require(‘egg’).Service; const Sequelize = require(‘sequelize’); const Op = Sequelize.Op;

class {{name}}Service extends Service {

  1. // 查询{{name}}列表
  2. async list(params, transaction = null) {
  3. const {
  4. ctx,
  5. app
  6. } = this;
  7. const result = await app.model.{{name}}}.findAndCountAll(option);
  8. return result;
  9. return res;
  10. }
  11. // 修改操作
  12. async update(params, transaction = null) {
  13. const {
  14. ctx,
  15. app
  16. } = this;
  17. const res = await app.model.{{name}}}.update(params, {
  18. where: {
  19. id: params.id
  20. },
  21. transaction
  22. });
  23. return res;
  24. }

}

module.exports = {{name}}Service; ``` 基于这个尝试,那么可以根据代码生成代码。
之后我将其做成前后分离的模式。用于页面选择操作生辰代码。链接