一、MySql事务
sql事务,保证所有sql执行成功,避免出现断档
const client = app.mysql.get('default');
const conn = await client.beginTransaction();
try {
// 1.执行SQL
await conn.select('process'{ where: { batchId: item } });
await conn.select('process'{ where: { batchId: item } });
await conn.select('process'{ where: { batchId: item } });
return await conn.commit();
} catch (err) {
// 2.执行出错,撤销操作
conn.rollback();
return err;
}
二、路由级中间件
中间件可用来统一处理请求,例如鉴权,判断等录状态,日志处理,或其它业务
通过中间件中ctx对象与next对象即可对业务逻辑进行处理与控制。
路由级中间件可以为每个路由单独挂载中间件
- 编写中间件 app/middleware/checkPermission.js
module.exports = (options) => {
return async (ctx, next) => {
console.log('测试中间件1');
await next();
console.log('测试中间件2');
};
};
- 挂载中间件 router.js
const checkPermission = app.middleware.checkPermission();
router.get('/api/test', checkPermission, controller.api.test);
- 编写 controller/api/test.js
async test() {
console.log("测试中间件3");
ctx.body = "23333"
}
- 执行结果 输出
测试中间件1
测试中间件3
测试中间件2
三、应用级中间件
应用级中间件会挂载到全局,每个路由都会被拦截,处理逻辑同上
- 挂载中间件 config/config-default.js
config.middleware = ['checkPermission', 'requestLoger'];
将会处理并拦截所有request。
四、request字符类型处理
egg.js默认使用koa-bodyParser处理request.body的数据,但当数据出现text/plain,text/json时会解析为空,需要手动添加类型进行兼容。
- config/config-default.js
config.bodyParser = {
jsonLimit: '1mb',
formLimit: '1mb',
enableTypes: ['json', 'form', 'text'],
extendTypes: {
text: ['text/plain', 'application/json', 'text/json'],
},
};
五、Egg各模块调用规则
- Controller之间无法互相调用
- Controller可以自由调用任何Service
- Service之间可以任意调用
六、防SQL注入
在egg.js中,所有查询都应该通过egg-mysql中的 select , insert , update 方法去实现数据库操作,若必须使用运用SQL语句进行操作,需要使用 mysql.escape() 方法对所有传入的动态参数进行转义。
const params = {
age:18,
sex:'boy'
}
const client = app.mysql.get('default');
const sql = `select * from table_name where age = ${mysql.escape(params.age)} and sex = ${mysql.escape(params.sex)};`
const result = await client.query(sql);