# nodex-cli

nodex-cli (opens new window) 是一个基于nodex-libs,可以快速搭建繁杂的脚手架,以提升工作效率。

同时,我们推荐直接使用脚手架,只需几条简单指令,即可快速生成项目(npm >=6.1.0)。

# 安装

nodex-cli 可以使用npm进行全局安装,并使用 nodex -h 来获取帮助

$ npm i nodex-cli -g
$ nodex -h

# 创建项目

# nodex init


运行以下命令来创建一个新项目:

$ nodex init <projectName>

启动应用程序

$ nodex start [dest]

nodex 命令有一些可选项,你可以通过运行以下命令进行探索

Usage: nodex [options] [command]

Options:
  -V, --version   output the version number
  -h, --help      display help for command

Commands:
  init            init a project.
  start           start a project.
  help [command]  display help for command

# 启动项目

nodex-cli 可以使用npm 或 nodex来启动

$ npm run dev
$ nodex start

open http://localhost:8080

# 文件结构

采用nodex-libs脚手架创建一个nodex服务项目的初始模板。

目录结构:

  |-- nodex-0
    |-- data   // 三个json文件表示不同环境下的数据库配置,逻辑处理文件配置,接口serv配置等
    |   |-- args-dev.json 
    |   |-- args-prod.json
    |   |-- args-stage.json
    |-- src
    |   |-- data.js    // 连接数据库,并查询返回数据
    |   |-- logic.js   // 逻辑处理文件,所有的逻辑处理放到该文件夹下
    |   |-- serv.js    // 存放路由文件
    |-- .eslintrc.json
    |-- .gitignore
    |-- Dockerfile
    |-- LICENSE
    |-- package-lock.json
    |-- package.json
    |-- pm2.prod.json
    |-- pm2.stage.json
    |-- README.md

# 使用示例

# data


根目录下的三个json文件表示不同环境下的数据库配置,逻辑处理文件配置,接口serv配置等

以 args-dev.json 为例,其中 json 文件中的 data, logic, serv 分别对应 src 下的三个同名的 js 文件。

{
  "data": {
    "mysql": {
      "host": "127.0.0.1",  // 主机名
      "port": 3306,         // 端口
      "user": "root",       // 数据库用户
      "password": "root",   // 数据库密码
      "database": "test"    // 数据库名称
    }
  },
  "logic": {
    
  },
  "serv": {
    "name": "nodex-0",
    "host": "127.0.0.1",    // 主机名
    "port": 8080,           // 运行的端口
    "cors": true,           // 是否允许跨域
    "log": true,
    "proxy": true           // 设置代理
  }
}

# src


# serv.js

Router 主要用来描述请求 URL 和具体承担执行动作的 Controller(logic) 的对应关系, 框架约定了src/serv.js文件用于统一所有路由规则。通过统一的配置,我们可以避免路由规则逻辑散落在多个地方,从而出现未知的冲突,集中在一起我们可以更方便的来查看全局的路由规则。

在下面定义了两个简单的路由:

  • 当用户执行GET /tset_get, logic.js中的 helloWorldGet方法就会执行。
  • 当用户执行POST /tset_post, logic.js中的 helloWorldPost方法就会执行。
'use strict';

const { libs, runtime } = nodex;
const { http } = libs;
const { logic } = runtime;

exports.init = async function (args) {
  console.log('serv init.');
  console.log('serv init args:', args);
  console.log('runtime:', runtime);

  const app = http.webapp(args);

  app.route(router => {
    router.get('/test_get', http.handler(logic.helloWorldGet));
    router.post('/test_post', http.handler(logic.helloWorldPost));
  });

  app.start();
};

# logic.js

我们通过 Router 将用户的请求基于 method 和 URL 分发到了对应的 logic 上,简单的说 logic 负责解析用户的输入,处理后返回相应的结果。nodex-libs推荐 logic 主要对用户的请求参数进行处理(校验、转换),然后调用对应的方法处理业务,得到业务结果后封装并返回结果。

同时,nodex-libs推荐 logic 方法统一放在 src/logic.js 文件下。

'use strict';

exports.init = async function (args) { 
  console.log('logic init.');
  console.log('logic init args:', args);
};

exports.helloWorldGet = async function () {
  return 'hello world!';
};

exports.helloWorldPost = async function () {
  return 'hello world!';
};

// 根据项目id查询项目
exports.getProjectInitById = async function({p_id}){
    fmt.required(p_id,'integer',1,11);
    return await data.getProjectInitById(p_id);
}

# data.js

简单来说

  • 保持 logic 中的逻辑更加简洁。
  • 保持业务逻辑的独立性,可以被多个 logic方法 重复调用。
  • 可以连接数据库,获取数据库信息返回给 logic 或将 logic 传过来的数据经处理后存入数据库。
'use strict';

const { libs } = nodex;
const { mysql } = libs;


exports.init = async function (args) { 
  console.log('data init.');
  console.log('data init args:', args);
  await mysql.init(args.mysql);
};

// 根据项目id查询项目
exports.getProjectInitById = async function(p_id){
    const sql = `
        select
            *
        from
            project
        where
            p_id = ${p_id}
    `;
    const result = await mysql.query(sql);
    return result;
}