前言《纸上谈兵总是肤浅的,但一定要自己动手。node虽然一直在断断续续的学习,但总是时不时的敲敲敲敲打打,没有系统,所以打算写一个项目,把之前的学习成果串联起来。为什么选择Eggjs?其实我觉得Koa足够轻量灵活,适合个人开发或者小型项目,但是如果有团队开发的经验,会更注重项目管理。与Koa相比,Eggjs项目我更喜欢以下几点:完善的文档,也就是说无论是交接还是新成员加入项目,直接扔掉官方文档,官方文档也是很好的学习体验材料;Egg坚持“约定优于配置”。我非常喜欢这个设定。在多人协作的项目中,我们有时需要花很多功夫来统一不同的编程习惯。比如有的人喜欢把public的方法放在utils/index文件夹下,有的干脆建一个utils.js,有的util不带s,没有对错之分,但是多人协作项目会让项目混乱,难以管理,并增加代码审查的成本。“约定优于配置”很好地解决了这个问题。大家按官方要求写。如有偏差,可直接翻阅文件,无需撕开。基于Koa,Koawheel经过一些适配后就可以使用了。不用担心生态问题。我也是一个node菜鸟,所以在这个系列中,我会按照自己从头实现的步骤来记录整个开发过程。创建Eggjs项目$mkdiregg-server&&cdegg-server$npminitegg--type=simple$npmiOK,项目初步成功,我们接下来的任务就是链接数据库。数据库链接数据库我选择mysql。毕竟行业是主流。这里我们使用Sequelize来管理和操作数据库。Sequelize是一个基于promise的Node.jsORM,因此您不必编写一堆SQL语句。数据库安装这里就不赘述了,按照菜鸟教程安装即可。安装并打开数据库。安装配置egg-sequelize插件(它会协助我们将定义好的Model对象加载到app和ctx中)和mysql2模块:npminstall--saveegg-sequelizemysql2在app/config/plugin.js中引入插件(全部引入egg的插件需要在这个文件中配置):sequelize:{enable:true,package:'egg-sequelize',}在app/config/config.default.js中配置Sequelize配置项:config.sequelize={dialect:'mysql',//表示使用mysqlhost:'127.0.0.1',//连接的数据库主机地址port:3306,//mysql服务端口database:'egg-db',//数据库名称username:'root',//你的数据库用户名password:'root',//你的数据库密码define:{timestamps:true,//默认添加createdAt,updatedAt,deletedAt时间戳paranoid:true,//设置软删除,删除时不删除数据,而是通过更新deleteAt标志删除freezeTableName:true,//冻结表名,防止创建表时将表名改为复数形式underscored:false,//防止驼峰式字段被转换为下划线},//这里有一个陷阱。Sequelize使用UTC时间。我们在东八区,所以需要加8//https://stackoverflow.com/questions/47367893/sequelize-reads-datetime-in-utc-onlydialectOptions:{dateStrings:true,typeCast(field,next){if(field.type==='DATETIME'){returnfield.string();返回下一个();},},时区:'+8:00',};创建模型在app文件夹下创建模型文件夹,所有模型文件都放在这里,现在我们创建一个用户模型,创建如下文件app/model/user.jsmodule.exports=(app)=>{const{STRING,INTEGER}=app.Sequelize;constUser=app.model.define('user',{id:{type:INTEGER,autoIncrement:true,//自增primaryKey:true,//设为主键},name:STRING(20),password:字符串(100),电话:字符串(11),电子邮件:字符串(30),});returnUser;};OK,现在数据库好像处理的差不多了,那我们写点代码,享受CRUD吧~写controller创建app/controller/user.js文件,写入如下内容:constController=require('egg').Controller;classUserControllerextendsController{//添加用户asynccreateUser(){constparams=this.ctx.request.body;constuser=awaitthis.ctx.model.User.create({...params});如果(用户){this.ctx.body={代码:200,数据:用户};}else{this.ctx.throw(500,'内部服务器错误');}}//获取所有用户asyncgetUsers(){constusers=awaitthis.ctx.model.User.findAll();this.ctx.body={代码:200,数据:用户};}}module.exports=UserController;在app/router.js中添加路由添加getUsers和createUser的路由,代码如下:module.exports=app=>{const{router,controller}=app;router.get('/',controller.home.index);router.post('/createUser',controller.user.createUser);router.get('/getUsers',controller.user.getUsers);};测试功能这个时候我们的代码已经基本完成了,通过请求对应的路由可以看到对应的数据库变化是的,但是不要忘记在请求之前在数据库中创建对应的数据库和用户表,否则报错会被举报。现在您可以手动创建它。后面我们可以使用Sequelize帮我们在项目启动的时候自动创建和更新表一切准备就绪后,打开Postman试一试,请求localhost:7001/getUsers得到如下数据:{"code":200,"data":[]}此时表为空,所以找不到,那我们通过post请求访问localhost:7001/createUser创建一条数据:{"name":"curry","password":"test1234","phone":"13412341234","email"":"test@gmai.com"}然而此时报错:invalidcsrftoken。看https://eggjs.org/zh-cn/core/...看看文档是怎么说的:CSRF(Cross-siterequestforgeryWebsiterequestforgery,也称为OneClickAttack或SessionRiding,通常简称为CSRF或XSRF,是对网站的恶意利用,CSRF攻击会向网站发起恶意伪造请求,严重影响网站安全,因此框架内置CSRF防御方案。这是Eggjs框架的安全策略,我们在开发的时候可以关闭,在app/onfig/config.default.js中添加如下代码:config.security={csrf:{enable:false}};改完再试:{"code":200,"data":{"id":1,"name":"curry","password":"test1234","phone":"13412341234","email"":"test@gmai.com","updatedAt":"2020-12-13T07:39:29.990Z","createdAt":"2020-12-13T07:39:29.990Z"}}成功!打开数据库刷新user表可以看到已经插入了这条数据,然后通过get再次请求localhost:7001/getUsers:{"code":200,"data":[{"id":1,"name":"curry","password":"test1234","phone":"13412341234","email":"test@gmai.com","createdAt":"2020-12-1315:39:29","updatedAt":"2020-12-1315:39:29","deletedAt":null}]}干得好!折腾了一番,终于看到了结果,但这只是开始。后面我们会继续实现用户注册和登录功能,涉及到用户注册时密码的处理,用户认证等功能。
