后端开发

后端的文件目录所示:

server
  |-api
  |-boot
  |-config
  |-drivers
  |-helpers
  |-middlewares
  |-views

pm2

pm2 作为 process manager,可以配置环境变量,将server目录加到环境变量中,所以在代码中使用require('drivers')便是引用 server 中的 drivers,可以简化书写,修改文件结构时也不用改跟多相对目录。

 "env": {
    "NODE_PATH": "server:."
  }

boot

node 服务的入口,读取配置文件,加载中间件和子项目。

程序目前使用的 node 框架是 express。const app = express();得到app;

middlewares

这里是中间件,包含

  • i18n
  • session处理
  • 错误处理

这里面的功能大多在服务启动时加载,处理每一个请求。

使用方式一般是在boot中,通过app.use()的方式将中间件加载进来。

helpers

包含工具性的一些功能,比如 querystring,paginate 等,这里的功能供其他项目调用。

drivers

此目录中包含子项目,比如数据库连接,OpenStack API 封装,它们被 api 调用时加载。

drivers/index.js

当 drivers 第一次被引用时,执行此文件,他的作用是遍历目录里所有的文件。然后将所有的 driver 组合起来,引用的方式 const mysql = require('dirvers').mysql;

let driver = {};

fs.readdirSync(__dirname)
  .filter(c => {
    return fs.statSync(path.join(__dirname, c)).isDirectory();
  })
  .forEach(c => {
    let cloud = require(__dirname + '/' + c);
    Object.assign(driver, cloud);
  });

module.exports = driver;

每个 driver 是一个文件夹,文件夹中有入口index.js文件。

api

api目录里面都是子项目。目录结构:

api
  |-index.js
  |-api1
    |-index.js
    |-api
    |-models
    |-views
  |-api2
    |-index.js
    |-api
    |-models
    |-views
//api/index.js

const fs = require('fs');

module.exports = function (app) {
  fs.readdirSync(__dirname)
    .filter(c => {
      return c.indexOf('.') === -1;
    })
    .forEach(c => {
      require(__dirname + '/' + c)(app);
    });
  return app;
};

api目录

在启动时加载,执行api/index.js接收 app,然后去遍历所有的目录。 api 下面的每个目录都是一个子项目,相互独立解耦,可以自由的增减。

api子项目

每个项目都有入口index.js文件,他们都暴露一个函数,接收 app,然后对 app 进行处理。 每个项目一般包含:api 定义接口,controller 处理业务逻辑,models 定义数据库表结构。 这里结构也不固定,可能没有数据库或逻辑层很简单。