npm install sails -




    
g

其中-g表示全局安装,这样安装之后就可以在任意一个项目(文件夹)中使用sailsjs了。
安装之后,就可以直接在nodejs里面使用sails命令行,在vscode终端(按ctrl+` 可以打开)输入:

sails new test-project //new 后面跟着的是项目名称,sails脚手架会自动创建同名子目录

接下来出现的界面里面,我们可以选择安装的模版:

Choose a template for your new Sails app:
 1. Web App  ·  Extensible project with auth, login, & password recovery
 2. Empty    ·  An empty Sails app, yours to configure
 (type "?" for help, or <CTRL+> to cancel)

sails是可以做全站混合开发的。如果选择Web App 它将会帮我们创建全站模版,包含建议控制器和view。由于前后端分离具有更好的灵活性和松散耦合性,是目前行业比较流行的开发模式。本次项目开发我们采用前后端分离模式,因此我们只是需要的把sails当做后端来开发各种api控制器,实现数据库操作和业务逻辑。我们不需要其他Web App的模版,所以这个地方可以选择 2,创建一个空的带基础框架的Sails app。
安装完成之后,原来的目录下面后多出一个子目录test-project,里面就是一套可以执行的sails框架的源代码。这个时候vscode显示目录依然是当前目录而不是以test-project为根目录,可以通过cd指令改变当前目录到text-project,也可以在vscode中关闭文件夹,然后重新打开tst-project这个文件夹,实现以该文件夹为子目录的效果。
安装成功之后,在命令行里面执行

sails lift
或是 node app.js //sails以app.js为入口文件

启动后,可以看到如下画面,表示启动成功,当前版本号:1.5.3 运行端口:1337

 info: 
 info:    Sails              <|    .-..-.
 info:    v1.5.3              |\
 info:                       /|.\
 info:                      / || \
 info:                    ,'  |'  \
 info:                 .-'.-==|/_--'
 info:                 `--'-------'
 info:    __---___--___---___--___---___--___
 info:  ____---___--___---___--___---___--___-__
 info: 
 info: Server lifted in `E:\Writing\mytest\test-project`
 info: To shut down Sails, press <CTRL> + C at any time.
 info: Read more at https://sailsjs.com/support.
debug: -------------------------------------------------------
debug: :: Wed Nov 16 2022 17:18:38 GMT+0800 (中国标准时间)
debug: Environment : development
debug: Port        : 1337
debug: -------------------------------------------------------

App结构

|-- test-project
    |-- app.js                   sails启动入口
    |-- package.json             npm 配置文件,包含应用程序运行所依赖的所有节点模块的名称和版本
    |-- README.md
    |-- .tmp                     编译后的静态文件
    |-- api                      数据模型,控制器等,MVC结构中的M和C
    |   |-- controllers
    |   |-- helpers
    |   |-- models
    |   |-- policies
    |-- assets                   保存sails用到的静态资源,模版文件等
    |-- config                   定义和配置文件
    |   |-- blueprints.js
    |   |-- bootstrap.js
    |   |-- custom.js
    |   |-- datastores.js
    |   |-- globals.js
    |   |-- http.js
    |   |-- i18n.js
    |   |-- local.js             端口设置等
    |   |-- log.js
    |   |-- models.js
    |   |-- policies.js
    |   |-- routes.js            api路由设置与对应控制器的action
    |   |-- security.js          安全配置,比如设置跨域
    |   |-- session.js
    |   |-- sockets.js           socket 服务配置,传输方法,心跳间隔,socket存储等
    |-- tasks   
    |-- views                   视图MVC里面的V,因为我们做控制器开发,views文件夹里面几乎不需要关注

默认端口是1337,如果有需要在config/local.js里面可以修改port,例如

module.exports = {
  port:1898  
 

local.js会自动加载,有时候也会在这个地方加载一些需要全局使用的库,比如lodash:

  • sails默认已经安装好了lodash,这是一个不错的工具库,可以通过local.js把它变成全局变量
* 引入lodash,sails默认已经安装这个库,具体使用参考https://www.lodashjs.com/ var _ = require('lodash'); module.exports = { port:1898

因为我们的设计模式是前后端分离,我们的前后端是两个独立站,出于浏览器的同源策略限制(同源策略会阻止一个域的JavaScript脚本和另一个域的内容进行交互)。前端的js代码访问后端的时候将会返回跨域错误。
要解决这个问题,就需要修改config/security.js,开发前期为了测试方便,可以直接放开限制,设置如下:

module.exports.security = {
 cors: {
    allRoutes: true,
    allowRequestMethods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
    allowOrigins: '*',
    allowCredentials: false

生产环境下,可以对具体来源网站和端口进行限制。

第一个Api控制器

编写一个控制器是非常容易的,甚至都不需要自己写代码,直接使用sails脚手架就可以实现,执行以下指令,sails将自动创建一个名为helloworld的控制器

sails generate controller helloworld

执行后结果如下:
在这里插入图片描述

  1. 打开HelloworldController.js,编写控制器程序:
* Hello 控制器 Hello: function (req, res) { res.status(200).send('Hello world');
  1. 增加控制器路由,打开config/routes.js,在module.exports.routes = {} 里面增加一条新路由如下:
module.exports.routes = {
  'GET /api/hello':{action:'Helloworld/Hello'},
  1. 保存之后,执行
sails lift
  1. 在浏览器中打开:http://localhost:1337/api/hello,我们看到浏览器里显示出我们在控制器里面输出的“Hello world”,至此第一个控制器完成。
    在这里插入图片描述

用Postman 做Api调试

我们的第一个Api采用的是Get方式请求数据,所以可以轻松通过浏览器进行请求测试。现在我们再Helloworld控制器里面再添加一个控制器,按Ctrl+C,退出Sailsjs,接下来

  1. 在控制器方面和上一个控制器没有什么不一样:
* Post 请求 * @param {*} req * @param {*} res TestPost: function (req, res) { res.status(200).send('这是一个POST方式的请求测试');
  1. 在config/routes.js,新增一个路由
module.exports.routes = {
  'GET /api/hello':{action:'Helloworld/Hello'},
  'POST /api/testpost':{action:'Helloworld/TestPost'},//新增控制器

保存后,重新运行sails lift

  1. 使用 Postman
    由于我们在路由器里面写的请求方式是POST,这个时候如果还是在浏览器地址栏里面输入网址http://localhost:1337/api/testpost,就会出现404错误。这种情况就需要Postman。Postman是一种常用的接口测试工具 点击下载 ,详见:https://www.postman.com/
    下载安装之后,在postman里面,添加post请求,如下
    在这里插入图片描述

MySql

为了更好的做数据库调试,如果是单人开发,可以自己安装MySql,如果是多人开发,可以考虑把MySql安装到云服务器,大家共同访问云服务器中的数据库。
我们以独立安装MySql为例,先到MySql官网下载社区版,
下载地址,选择社区版下载,现在的版本号是8.0以上。下载后安装即可。另外可以再安装Navicat或是HeidiSQL之类的数据库连接和管理工具。

命令行操作MySql

  1. 找到mysql安装位置(mysql.exe所在目录),默认是C:\Program Files\MySQL\MySQL Server 8.0\bin,在空白处按住Shift+右单击,选择“在此处打开PowerShell 窗口”
  2. 输入 .\mysql -uroot -p123456 (这里.\mysql 是指本目录下的mysql指令 -u后面是用户名 -p后面是密码,实际数据根据自己设置的账号密码修改
  3. 至此我们已经用root账号,通过命令行登录mysql,可以执行后面的语句,执行完如果需要退出,可以打入 \quit 指令

8.0版本加密问题

MySQL8.0版本的加密方式(caching_sha2_password)和旧版本(mysql_native_password)不一样,目前Node还不支持caching_sha2_password加密方式。所以Sails连接MySql会有问题。修改调整MySql服务器的加密方式

  1. 更改加密方式 以 root账号为例,设置密码不过期 (可选)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
  1. 修改密码,以下示例中 123456为新密码并且使用旧版本的加密方式mysql_native_password。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
  1. 退出命令行的mysql
\quit
  1. 重启服务
    进入windows服务管理,重启MySql80 服务 或者执行net stop mysql80 和 net start mysql80 指令

Sails 操作Mysql

  1. 在mysql上面创建一个数据库,比如admindata。
  2. 打开vscode,在终端中安装sails-mysql
npm intall sails-mysql -save
 

如果安装成功,可以看到package-json里面的依赖库会多一个"sails-mysql": “^3.0.0”

  1. 打开config/datastores 配置数据存储选项,在module.exports.datastores 的default属性内添加mysql适配器如下:其中url里面包含mysql用户名密码和数据库名称
adapter: 'sails-mysql',
url: 'mysql://root:123456@localhost:3306/admindata',
  1. 设置config/model
    这个文件用于配置数据模型,有几个需要关注的设置
  • schema: true, 这是设置严格匹配数据表的模式,建议设置为true,一般只要使用类似MongoDB这种非关系型数据库才会设置为false。

This setting is only relevant for models using schemaless databases like MongoDB

  • migrate: 数据迁移配置,有三个选项:‘alter‘,‘’safe’,‘drop’, 其中:
    • alter:与老数据自动合并,保留旧数据,但是如果修改旧字段类型并且有旧的数据,会提示错误,推荐使用。
    • safe:sails启动的时候,不检查数据库,也不删除数据表。一般在开发结束使用。
    • drop:sails启动的时候,会删除数据库中的所有表里面的数据,并且没有提示。一般在开发前期使用(慎重)。

alter 选项遇到mysql8.0 带有加密字段的时候,如果有旧数据,会出错,必须删除旧数据才能继续。这个是一个Bug,应该和MySql默认采用的authentication plugin是caching_sha2_password有关系。 MariaDB或其它版本MySql不会有这样的问题。

  • attributes:
    • 这个地方用来配置一些共有属性,比如每个表都要有个id,那么我们可以这样写
      • id:{type:‘number’,autoIncrement:true}
      • 考虑到在表的更新的时候,需要判断是否是最新,以及后面可能会用到的创建时间,我们可以添加两个每个表都会自动添加的属性createAt和updateAt 并且都分别设置为autoCreateAt和autoUpdateAt,照这个思路,attributes可以这样写:
 attributes: {
    createdAt: { type: 'number', autoCreatedAt: true, },
    updatedAt: { type: 'number', autoUpdatedAt: true, },
    id: { type: 'number', autoIncrement: true, },
  • cascadeOnDestroy:关联删除,可以开启cascadeOnDestroy功能,用于如One-to-many关系下的关联删除。
  • dataEncryptionKeys:对称加密密钥,可以配置对敏感属性数据加密时的密钥,比如密码字段等

创建第一个model

一个 model表示一组结构化数据,称为记录。model通常对应于数据库中的表/集合,attribute对应于列/字段,record对应于行/文档。基于现代程序设计的convention over configuration (约定大于配置)原则。model一般是由放在Sails应用程序的api/models/文件夹中创建文件来定义的。
我们尝试定义一个用户数据模型,在api/models/文件夹中创建user.js,代码如下:

 module.exports = {
  attributes: {
    email: { type: 'string'},
    password: { type: 'string'}

作为示例,这是一个非常简单的用户数据,里面只有email和password,后面再根据情况扩展。

实现一个model的增删改查

通过sails脚手架执行创建控制器指令(也可以通过在api/controllers 遵守文件名和控制器名称约定手动添加)

sails generate controller user

打开UserController.js,修改代码如下:

* UserController * @description :: Server-side actions for handling incoming requests. * @help :: See https://sailsjs.com/docs/concepts/actions module.exports = { //新增一条用户记录 create: async function (req, res) { let result=await user.create({email:'[email protected]',password:'123456'}).fetch(); return res.status(200).send(result);

添加路由:打开config/routes.js,添加路由如下:

'POST /api/testpost':{action:'user/create'},

打开postman,post到localhost:1337/api/testpost,测试结果如下:因为我们采用fetch,添加完数据之后,会返回我们添加的数据。我们发现返回的数据里面有createAt,updateAt,id三个字段,并且都自动赋值。这个就是我们在config/models.js里面设置的自动添加到每个表的配置。
在这里插入图片描述
使用Navicat或HeidiSQL之类第三方工具,打开MySql或MariaDB查看我们的admindata数据库,发现里面除了user表,还有一个archive,这个是sails自动生成的归档表。打开user表,可以看到id已经设为自动增长。sails的orm(waterline)已经帮我们做了许多的工作。

删除和修改操作先略过,我们会在下一篇Typescript的应用继续讲解。

sails.js 如果您是当前使用Django,Laravel或Rails等框架的开发人员,那么您可能已经听说过Node.js。 您可能已经在项目中使用了流行的前端库,例如Angular或React。 到目前为止,您应该考虑完全转换到基于Node.js的服务器技术。 但是,最大的问题是从哪里开始。 今天,JavaScript世界在过去几年中以令人难以置信的快速增长,并且似乎还在不断扩展。 Sails.js 入门指南及实战教程 Sails.js 是一个基于 Node.js 的实时 MVC 框架,专门设计用于构建高效、可扩展的应用程序。它利用 Express.js 作为其底层 web 服务器,通过 Socket.IO 支持实时交互,使得创建 RESTful API、处理 Web 表单提交以及管理数据库变得异常轻松。Sails.js 强调可维护性和数据驱动的设计,非常适合于构建... 从零开始创建一个完整的 sails 应用涉及多个阶段的工作内容包括但不限于初始化新工程实例;定义实体关系映射规则;以上展示了如何利用官方提供的 scaffolding tool 创建一个新的名为 “myApp” 的空白帆船工程项目,并指定不包含任何前端依赖项的同时引入必要的 MySQL 数据驱动适配器组件以便后续连接外部存储介质使用. Sails.js是遵循原则的“约定优于配置”一个Node.jsMVC(模型-视图-控制器)的框架。 它是由流行的Ruby on Rails Web框架的启发,并允许您快速建立的REST API,单页的应用程序和实时(的WebSockets为主)的应用程序。 它广泛使用的代码生成器,让您用较少的代码编写构建应用程序-尤其是可以否则脚手架通用代码。 该框架是建立在Express.js,最流行的N... Sails.js: 快速构建 Web 应用程序的 MVC 框架 sailsRealtime MVC Framework for Node.js项目地址:https://gitcode.com/gh_mirrors/sa/sails Sails.js 是一个基于 Node.jsMVC 框架,用于快速开发实时、数据驱动的 Web 应用程序。它的设计目标是提高开发者的工作效率,减少重复工作,并提... sails.js是一个后端开发框架,它是基于Node的著名框架express之上的。当前工作接手了一个系统,该系统的console部分是以sails.js完成其前后端功能的,故学习了sails.js的部分官方文档,特以此系列笔记以记之。因初学乍练,如有错误,欢迎指正。 在官网中,使用Sails框架项目的基本结构如下图所示: 1.package.json 此文件是npm的标准包管理文件,它... Sails.js:实时MVC框架的杰作 Sails.js,一个采用JavaScript编写的实时MVC框架,专为Node.js量身定做,旨在简化企业级应用的构建过程。它沿袭了类似Ruby on Rails的架构风格,同时拥抱数据驱动的现代Web应用与API开发趋势。Sails.js尤其擅长于实现如聊天应用等实时特性,并自1.0版本起,默认支持await语法,告别嵌套回调的困扰。 MVC... 选择Sails.js 一个明显的Node.js风格。具体来讲,Sails使用分层开发和约定优于配置(conventionoverconfiguration),这两种开发技术已被Rails和类似的框架普及。Sails还集成了其他一些Node.js包作为关键组件,这意味着不需要从头学习该框架。另一个优势是,事实上Sails.js的文档在不断改进,这...