使用Sequelize操作MySQLSequelize是Node.jsv4及之后的基于promise的ORM。它支持方言PostgreSQL、MySQL、SQLite和MSSQL,并为事务、关系、读取复制等提供可靠支持。Egg官方也有一个egg-sequelize插件,所以这里使用它来执行代码中的所有SQL操作。添加并启用sequelize插件//{workdir}/config/plugin.js//挂在app下,通过app.sequelize使用exports.sessionRedis={enable:true,package:"egg-sequelize"};createtablebeforestart://{workdir}/app.jsmodule.exports=app=>{app.beforeStart(asyncfunction(){awaitapp.model.sync({force:false});//false将删除和如果true没有被覆盖,则重新创建});};添加模型文件://{workdir}/app/model/user.js必须使用此目录//挂在ctx下并使用module.exports=app=>{const{STRING,INTEGER,DATE,BIGINT}=app.Sequelize;constUser=app.model.defineviactx.model.User.fn()("user",{login:STRING,id:{type:BIGINT(11),autoIncrement:true,primaryKey:true,unique:true},角色:{类型:整数,默认值:0},名称:字符串(30),密码:字符串(32),年龄:整数,last_sign_in_at:DATE,created_at:DATE,updated_at:DATE});返回用户;};有一个问题。添加外键没有解决。文档中,可以通过app.createAnonymousContext()创建匿名ctx,但是这里报错,因此,无法获得其他模型。这里设置外键需要sequelize的常用API:Model.findOne({where:{filed:'value'}}).then(...)//queryModel.create({filed1:'value',filed2:'value'}).then(...)//createModel.destroy()//delete//...官方文档地址:http://docs.sequelizejs.com中文APIsession和redis配置Egg已经内置-inSeesion插件可以直接通过ctx.session使用,session可以自定义外存,如下//{workdir}/app.jsmodule.exports=app=>{app.sessionStore={*get(键){//返回值;},*set(key,value,maxAge){//设置要存储的键},*destroy(key){//销毁键},};};但是这里使用了egg-redis和egg-session-redis两个插件来将session存储在redis中。启用插件://{workdir}/config/plugin.jsexports.sessionRedis={enable:true,package:"egg-session-redis"};exports。redis={enable:true,package:"egg-redis"};插件配置://{workdir}/config/config.default.jsconstdatabase="egg";constredisHost="192.168.189.130";constdbHost="localhost";module.exports=appInfo=>{constconfig={};配置.redis={//单redisclient:{port:6379,//Redis端口host:redisHost,//Redishostpassword:"",db:0}};config.sessionRedis={key:"EGG_SESSION",maxAge:24*3600*1000,//1天httpOnly:true,encrypt:false};返回配置;};会话示例//{workdir}/app/controller/auth.js...asynclogin(ctx){ctx.validate(userRule);constuser=awaitctx.service.auth.login(ctx.request.body);ctx.assert(user,"用户名或密码错误");consttoken=awaitapp.genToken(user.id,ctx.request.ip);ctx.session.user=user.id;ctx.session.token=token.id;ctx.status=204;}...token实现token主要是用来记录一些用户登录信息,存放在db中。首先定义tokenmodel://{workdir}/app/model/token.jsmodule.exports=app=>{const{STRING,DATE,BIGINT,BOOLEAN}=app.Sequelize;constToken=app.model.define("token",{id:{type:BIGINT(11),autoIncrement:true,primaryKey:true,unique:true},user:BIGINT(11),expire:DATE,ip:STRING,valid:BOOLEAN});returnToken;};tokenDB操作服务层code://{workdir}/app/service/token.jsconstmoment=require("moment");module.exports=app=>{classTokenextendsapp.Service{asyncfetchOne(id){consttoken=awaitthis.ctx.model.Token.find({where:{id:id}});返回令牌;}asyncgenToken(userId,ip){constexpire=newDate(moment().add(1,"days"));consttoken=awaitthis.model.Token.create({expire,ip,user:userId,valid:true});返回令牌;};}返回令牌;};登录后在session中记录token的id....在中间件中添加token校验....
