Sailsjs从零开始
文章平均质量分 96
本栏目从零开始,使用Sailsjs框架创建一个符合后台管理系统要求的后端。内容包括:数据库操作,改造Sailsjs对Typescript的支持,Json Web Token(JWT),Swagger,Sails源代码解析等
JimmyTsai75
这个作者很懒,什么都没留下…
展开
-
十一、通用控制器,Response中间件及错误日志
作为服务端,程序的稳健是非常重要的事情。我们的UserController已经实现了对user表的增删改查,实际的系统不可能只有一个表,如果按照UserController控制器的这种思路,那么一个表就需要一个控制器,并且不同的控制器功能大致相同,这种设计显然是不合理的。这几个控制器将会是未来前端使用比较多的,一个好的软件项目,应该要有完善的文档,我们用Swagger,必须清楚的描述所有这几个控制器的使用说明,调用的Request body示例,以及其他注意事项,因此我们需要新建一个Swagger。原创 2023-01-28 11:59:54 · 397 阅读 · 0 评论 -
十、Update 存储过程
对于修改数据,我们需要做一个存储过程,要求如下:在修改的存储过程中,执行修改的时候发现已经被其他用户修改过了,或者是锁表的时候失败,我们可以选择的做法有两种:两种方式都可以达到目的。但是如果正常返回,我们在程序端使用事务同时执行多条SQL语句的时候,因为返回的时候数据库状态是正常的,promise编程就不能捕捉到异常,也因此不能及时回滚数据,这样就会导致我们不想要的结果。因为上述修改数据要求里面,如果有不满足要求的情况,我们都希望后面的操作应该及时停止,已经修改的部分操作应该回滚。因此,对于不想要修改的情原创 2022-12-24 11:26:43 · 1521 阅读 · 0 评论 -
九、Waterline的删除和SQL事务
令人遗憾的是,Waterline 里面并没有很好的实现对事务操作的支持,假如我们需要回滚,Waterline里面并没有明确的回滚语句,并且默认的数据库连接connection配置是把一次连接发送多条语句的开关关闭掉的,这样我们不能在同一个连接里面做回滚操作。这就要求删除数据的时候,要执行软删除(逻辑删除,物理不删除)。字段标记:设置一个布尔类型的字段 IsDelete,该字段默认默认为false,要删除的时候把记录的IsDelete 改写为true,这种做法实际上是修改数据的做法。原创 2022-12-16 09:00:16 · 164 阅读 · 0 评论 -
八、使用存储过程模拟Waterline的查询
env文件夹里面的文件名称和Nodejs的环境变量NODE_ENV同名,当Sails启动的时候,系统根据启动时的NODE_ENV名称加载env里面的配置文件,比如环境变量是production的时候,就加载config/env/production.js,加载后这个配置文件里面有设置的内容会覆盖model文件夹里面对应内容。如果当前的NODE_ENV名称在config/env文件夹里面找不到对应的文件名称,Sails的配置项就不会被修改,所有配置项的设置值为config里面每个.js文件的内容。原创 2022-12-10 19:51:55 · 165 阅读 · 0 评论 -
七、深入理解Waterline的多段查询(Query)
forgeStageTwoQuery 具体文件是waterline库的 utils/query/private/forgeStageTwoQuery.js,在waterline是私有函数,并没有直接被export出来,我们自然是可以修改waterline库的源代码,但是一旦修改依赖库的源代码,除非我们提交给源代码管理方并成功合并我们的request,否则日后依赖库升级了,我们就可能会因为我们的分叉而无法升级依赖库的新功能。不论是哪种查询函数,都需要指定查询条件,相当于SQL语句里面的Where。原创 2022-12-10 19:49:45 · 240 阅读 · 0 评论 -
六、Sails中执行存储过程模拟Waterline的Create插入数据
插入新数据是比较单纯而且简单的功能。在存储过程中可以通过拼接insert语句来实现。如果需要插入多条语句,insert后面的values可以增加有多个数据,这种操作的效率还是比较高的。拼接insert语句,我们需要tableName,字段名称,字段值以及插入后是否返回已经插入的数据的开关变量fetch,在代码和数据库之间传递值或是字段名称,可以通过上一篇博文里面说到的转义操作来实现对关键词的保护,代码在传递参数给数据库的过程中要传递的内容再加上“”(双引号)可以一定程度防止sql注入攻击。参数部分代码如下:原创 2022-12-04 14:26:03 · 407 阅读 · 0 评论 -
五、解读Sails之Waterline源代码
因为工作需要调用存储过程来实现对数据库的操作。为此我们需要更加深入的了解Sails是怎么发送Sql指令以及发送了什么样的Sql指令。在Sails里面执行数据库操作的是Waterline(ORM),前面我们使用Sails的config/datastores做数据库配置的时候,需要先安装一个叫sails-mysql数据库适配器。这个数据库适配器也是开源项目https://github.com/balderdashy/sails-mysql,进入该项目的github可以看到它的依赖库里面是这样的:也就是它操作m原创 2022-12-03 16:43:27 · 565 阅读 · 0 评论 -
四、Sails项目的Api文档——集成Swagger解决方案
Swagger是一套基于OpenAPI规范构建的开源工具,它是一种规范,你只需要按照它的规范去定义接口及接口相关的信息。再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,生成客户端和服务端的代码,以及在线接口调试页面等等。在开发新版本或者迭代版本的时候,只需要更新Swagger描述文件,就可以自动生成接口文档和客户端服务端代码,做到调用端代码、服务端代码以及接口文档的一致性。为了能更感性直观的理解Swagger,请大家前往归纳一下,大约有以下几点。原创 2022-11-25 20:05:58 · 612 阅读 · 0 评论 -
三、Sails 中使用Jwt进行身份认证
由于我们是完全前后端分离的开发模式,我们的后端对前端提供Api,这个时候Api就会暴露出来,有些Api是包含敏感信息的。出于安全考虑的设计,肯定不允许任何人都可以访问这样的Api,这个时候就需要对Api的请求(request)进行身份认证(Authorization)。这种情况我们可以采用Jwt(Json Web Token)来完成这个事情。原创 2022-11-24 17:47:23 · 675 阅读 · 0 评论 -
二、 在Sails中使用Typescript
要达到真正对后面的编程有强类型约束,我们需要做两个事情,一个是把sails里面的waterline(ORM)这部分消化掉,并且写成相关联的typing(.d.ts)。一个是要把api的请求(request)和响应(response)消化掉,写出相应的interface为了规划整个App的文件结构,我们在根目录下面新建一个typing文件夹,用来存放这个App所需要的类型定义。原创 2022-11-18 14:59:52 · 1180 阅读 · 1 评论 -
一、Sails基础操作
sails是可以做全站混合开发的。使用Navicat之类第三方工具,打开mysql查看我们的admindata数据库,发现里面处理user表,还有一个archive,这个是sails自动生成的归档表。因为我们的设计模式是前后端分离,我们的前后端是两个独立站,出于浏览器的同源策略限制(同源策略会阻止一个域的JavaScript脚本和另一个域的内容进行交互)。为了更好的做数据库调试,如果是单人开发,可以自己安装MySql,如果是多人开发,可以考虑把MySql安装到云服务器,大家共同访问云服务器中的数据库。原创 2022-11-17 17:38:40 · 955 阅读 · 2 评论 -
零、从Github开始
github基本用法,ssh-keygen和git clonegithub团队合作模式,fork pull request原创 2022-11-16 16:32:42 · 235 阅读 · 1 评论