一、Sails基础操作

article/2025/9/14 4:18:01

本篇目录

  • Sails 安装
  • App结构
  • 修改端口
  • 跨域问题
  • 第一个Api控制器
  • 用Postman 做Api调试
  • MySql
    • 命令行操作MySql
    • 8.0版本加密问题
  • Sails 操作Mysql
    • 创建第一个model
    • 实现一个model的增删改查

Sails 安装

Sailsjs提供安装脚手架,使用之前可以先安装Sailjs

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 recovery2. 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';
  1. 刷新:
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:'abc@gmail.com',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的应用继续讲解。


http://chatgpt.dhexx.cn/article/10rQ8VVt.shtml

相关文章

sails

sails介绍 node.js的MVC框架&#xff0c;完全继承Express&socket.io的一些API 使用 全局安装 npm install -g sails创建项目 sails new 项目名称选2 选2 启动项目 sails liftsails框架目录介绍 api MVC结构项目代码目录controller层controller层尽量只做数据封装&…

Sails基础之Models层的config/datastores配置

配置与使用 Sails提供并支持多种Models层的存储&#xff08;https://sailsjs.com/documentation/concepts/extending-sails/adapters/available-adapters&#xff09;&#xff0c; 使用时需要在应用程序项目下安装对应的adapter并且在config/datastores或config/env/productio…

Sails的简单学习

这里贴出Sails的官方 一.Sails的简单介绍 官网上说&#xff1a; The web framework of your dreams.你梦想中的web框架。 Sails让创建自定义、企业级的Node.js应用的工作变得简单。它模拟了大家熟悉的诸如Ruby on Rails这种框架的MVC设置模式&#xff0c;但是也拥有满足现代…

什么是Sails

Sails的关键字 Realtime MVC Framework for Node.js Node.js Sails采用纯粹的Node.js进行构建&#xff0c;你只需要掌握一门javascript编程语言就可以构建Sails应用程序&#xff08;Web程序&#xff09;&#xff1b; MVC Framework Sails提供了基于MVC结构组织Web程序的基础…

sublime插件anaconda的设置

在 python 编辑环境下&#xff0c;使用 anaconda 完成一些代码补全和提示 具体设置如下 {//由于Anaconda插件本身无法知道Python安装的路径&#xff0c;所以需要设置Python主程序的实际位置"python_interpreter": "../python.exe",//忽略各种空格不对, 超…

Sublime 插件安装

1、百度搜索 Sublime3&#xff0c;进入 Sublime3 官网下载安装文件 注意&#xff1a;不要走到 Sublime2 的官网去下载&#xff0c;也不要使用 Sublime 的其它中文汉化版本&#xff1b; 2、下载 github 的 Package Control 包&#xff0c;下载地址&#xff1a; https://githu…

Sublime插件安装

1.PackageControl 功能&#xff1a;安装包管理 简介&#xff1a;sublime插件控制台&#xff0c;提供添加、删除、禁用、查找插件等功能 使用&#xff1a;https://sublime.wbond.net/installation 安装方法&#xff1a; CTRL &#xff0c;出现控制台粘贴以下代码至控制台 …

解决sublime无法下载插件问题

解决sublime无法下载插件问题 最近遇到了无法在sublime下载插件的问题&#xff0c;解决方法如下。 首先下载一个文件&#xff0c;地址如下 https://pan.baidu.com/s/1OlC0q8MwiZ_cEbs56SIwzw&#xff0c;提取码为vef9 下载完成后将其解压 再放入sublime文件夹中 接着点开P…

mac sublime安装插件

sublime 安装插件 需要等待一会&#xff0c;在弹出的新窗口&#xff0c;输入要添加的插件的名称&#xff0c;选择确认就可以了 以 Pretty JSON 插件为例&#xff0c;在将json字符串粘贴到文件之后&#xff0c;使用&#xff1a; control command j 进行格式化 调用搜索栏 shi…

java开发sublime插件_开发者最常用的8款Sublime text 3插件

5. SublimeCodeIntel Sublime​Code​Intel 作为一个代码提示和补全插件&#xff0c;支持Javascript、Mason、XBL、XUL、RHTML、SCSS、python、HTML、Ruby、Python3、XML、Sass、XSLT、Django、HTML5、Perl、CSS、Twig、Less、Smarty、Node.js、Tcl、TemplateToolkit 和 PHP 等…

Sublime Text - SublimeREPL插件的配置

1. 菜单Preferences -> Browse Packages&#xff0c;打开安装组件所在的文件夹&#xff0c;进入文件夹Data\Packages\SublimeREPL\config\Python&#xff0c;打开文件Default.sublime-commands&#xff0c;复制如下代码 { "caption": "SublimeREPL: Pyth…

Sublime常用c语言插件

1. Alignment 按等号对齐&#xff0c;强迫症患者必备 Alignment&#xff1a;选中并按ctrlalta就可以使其按照等号对齐 2. 配色方案Enki或者earthbound 3.A file icon 文件图标 4.CoolFormat&#xff1a;C代码格式化 简单好用的代码格式化工具&#xff0c;相当于简化版的Astyl…

Salesforce开发工具Sublime插件(一)

Salesforce开发工具Sublime插件 1. 下载Sublime 3(这是最新) http://www.sublimetext.com/3 进行脑残试的安装方法,下一步即可. 2.装好后打开.exe 3.安装Package Control 这个东东是一个方便 Sublime text 管理插件的插件&#xff0c;这个强大&#xff0c;把它装上去了&#…

关于Sublime的下载与插件安装

Sublime的中文网http://www.sublimetext.cn/ 下载Sublime Sublime的中文网http://www.sublimetext.com/下载Sublime 下载完成 ctrlShiftp 输入install package,确定&#xff0c;此时等待再次出现搜索框&#xff0c;现在就可以下载插件了&#xff0c;现在直接搜索需要的插件名字…

sublime常用插件及安装方式介绍

Sublime Text 是一个文本编辑器&#xff08;收费软件&#xff0c;可以无限期试用&#xff09;&#xff0c;同时也是一个先进的代码编辑器。Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来&#xff0c;它最初被设计为一个具有丰富扩展功能的Vim。 Sublime Text具有漂…

sublime 的插件安装

sublime 安装插件的方法有两种&#xff0c;一种是直接下载插件压缩包&#xff0c;放在browse packages 中 还有就是线上安装&#xff0c;就是本次要详细记讲的&#xff0c;写这篇文章主要为了记录下&#xff0c;下次方便查找 sublime的插件安装方法 插件安装&#xff1a;如果在…

Sublime插件安装与提高Verilog编写效率插件推荐

前言 相对于Vivado与Quartus自带的编辑器&#xff0c;使用Sublime可以提高Verilog的编写效率。Sublime是可以自己编写插件并使用的&#xff0c;合理的运用插件可以提高开发Verilog生产力。 一、插件安装 1.打开Sublime&#xff0c;点击【Preferences】、【Package Control】…

Sublime插件推荐

常用插件推荐 Alignment: 自动对齐代码 SublimeLinter 提示编写代码中存在的不规范和错误的写法 Sublime CodeIntel代码提示和补全 Bracket Highlighter代码匹配 SideBarEnhancements 侧栏右键功能增强 ConvertToUTF8,GBK编码兼容 Emmet让编写代码变得简单 HTML-CSS-…

实用的sublime插件集合 – sublime推荐必备插件

插件介绍 Sublime Text 3 安装Package Control 原来Subl3安装Package Control很麻烦,现在简单的方法来了 一、简单的安装方法 使用 Ctrl+`快捷键或者通过 View->Show Console菜单打开命令行,粘贴如下代码: import urllib.request,os; pf = Package Control.sublime-packa…

Sublime插件开发指引【教程导向】

因为工作的原因&#xff0c;会接触到公司自己开发的自动化语言&#xff0c;但是这个语言从开发到现在&#xff0c;一直没有一个匹配的IDE&#xff08;其实是有一个网页版的IDE&#xff0c;但是不好用没人用&#xff09;&#xff0c;而一直使用Notepad&#xff0c;他们习惯了&am…