generator-naive取名为naive
的目的是让你明白膜法的力量,以至于你不总在Node.js
项目开发过程中显得那么too young, too simple, sometimes naive.
- npm install -g yo
- npm install -g generator-naive
- mkdir myapp && cd myapp
- yo naive
generator-naive
是一个基于Koa2
的Node.js
服务端MVC
脚手架。方便我们快速完成服务端接口开发。
Koa2
MySQL
- 在本地数据库导入示例
sql
文件,示例sql
在sql/too_young_too_simple.sql
。 - 更改
config/local.js
文件,设置本地sql
用户名和密码。以保证成功连接数据库。 - 打开浏览器
localhost:3000/test
,查看返回结果。
不需要在通过JSON
文件配置化注册路由,将router
和handler
合二为一,你只需要更改router
目录下的函数即可实现路由注册:
const Router = require('./../framework').Router;
const testService = require('./../service/test_service');
const joi = require('joi');
const schema = require('./../schema');
const PATH = '/test';
class TestRouter extends Router {
/**
* getTest -> { "path": `${PATH}/insert`, "method": "GET" }
* @param {Object} ctx
*/
async getTest(ctx) {
let data = await testService.test();
console.log(data);
ctx.ok(data);
}
/**
* getInsert -> { "path": `${PATH}/insert`, "method": "POST" }
* @param {Object} ctx
*/
async postInsert(ctx) {
let { error } = joi.validate(ctx.request.body, schema.postInsert);
if (error !== null) {
return ctx.fail(error.name);
}
let { userXuming, userMobile } = ctx.request.body;
let data = await testService.insert(userXuming, userMobile);
console.log(data);
ctx.ok({});
}
}
// mount router to path: PATH
module.exports = new TestRouter().mount(PATH);
项目启动后,会在控制台打印对应的路由信息如下:
在启动本地数据库之后,可以测试对应的接口详情:
使用generator-naive
,SQL
操作则更加简单,你不用关心MySQL
连接等相关操作,只需要在service
层调用你写的dao
即可。通过在dao
层传入DbUtil.queryEscape
的参数即可完成SQL
查询。
const BaseClass = require('./../framework').BaseClass;
const DbUtil = require('../util/db_util');
class testDao extends BaseClass {
constructor(...args) {
super(...args);
// regis your table
this.table = 'user_info';
}
getAllData() {
return DbUtil.queryEscape(`
SELECT
*
FROM
${this.table}
`);
}
insertUser(name) {
return DbUtil.queryEscape(`
INSERT INTO
${this.table}
(name)
VALUES
(:name)
`, {
name: name
});
}
};
module.exports = new testDao();
generator-naive
使用winston
来进行日志打印,你只需要在任何需要打印日志的地方引入winston
即可完成日志打印。
winston.info('too young too simple, sometimes naive');
参数校验的目的是防止SQL
注入,项目使用joi来进行参数校验。
- 首先需要在
schema
目录下书写joi
校验规则如下:
const joi = require('joi');
module.exports = {
postInsert: {
userXuming: joi.number().integer().required(),
userMobile: joi.number().integer().required(),
}
}
- 然后在每个
handler
中对入参做对应的参数校验:
let {
error
} = joi.validate(ctx.request.body, schema.postInsert);
if (error !== null) {
return ctx.fail(error.name);
}
- 日志打印记录完善
- 防止
SQL
注入,使用joi
校验参数 -
express
支持 - 配置化
yeoman