Sails.js是遵循“约定之上的配置”原则的Node.js MVC(模型-视图-控制器)框架。 它受到流行的Ruby on Rails Web框架的启发,可让您快速构建REST API,单页应用程序和实时(基于WebSockets)应用程序。 它充分利用了代码生成器,使您可以减少编写代码的时间来构建应用程序,尤其是那些通常可以被脚手架打折的通用代码。
该框架建立在Express.js(一种最流行的Node.js库)和Socket.io(一种JavaScript库/引擎)的基础之上,该JavaScript /引擎用于向应用程序添加实时的,基于事件的双向通信。 在撰写本文时,Sails.js的官方稳定版本是0.12.14 ,可从npm获得 。 Sails.js 1.0版尚未正式发布,但是Sails.js的创建者表示 , 1.0版已在某些生产应用程序中使用,他们甚至建议在启动新项目时使用它。
主要特点
Sails.js具有许多出色的功能:
- 它基于Express.js构建
- 它具有WebSockets的实时支持
- 它需要一种“约定之上的配置”方法
- 借助蓝图,它具有强大的代码生成功能
- 强大的Waterline ORM / ODM使其与数据库无关
- 它支持同一项目中的多个数据存储
- 它有很好的文档。
当前有一些重要的缺点,例如:
- 在Waterline中不支持JOIN查询
- 直到Sails v1.0才支持SQL事务(在撰写本文时为beta版)
- 直到1.0版,它仍然使用Express.js v3,该版本已停产(报废)
- 发展非常缓慢。
Sails.js和Express.js
软件开发全部与构建抽象有关。 Sails.js是Express.js(它本身是Node的HTTP模块的抽象)之上的高层抽象层,它提供路由,中间件,文件服务等。 它还添加了功能强大的ORM / ODM,MVC架构模式和功能强大的生成器CLI(以及其他功能)。
您可以使用Node的低级HTTP服务和其他实用程序模块(例如文件系统模块)来构建Web应用程序,但是除了学习Node.js平台之外,不建议使用它。 您还可以加强并使用Express.js,这是一个流行的轻量级框架,用于构建Web应用程序。
您将具有用于Web应用程序的路由和其他有用的构造,但是您需要处理从配置,文件结构和代码组织到使用数据库的几乎所有工作。
Express没有提供任何内置工具来帮助您进行数据库访问,因此您需要将必需的技术结合在一起以构建完整的Web应用程序。 这就是所谓的堆栈。 使用JavaScript的Web开发人员大多使用流行的MEAN堆栈 ,该堆栈代表MongoDB,ExpressJS,AngularJS和Node.js。
MongoDB是Node / Express开发人员中首选的数据库系统,但是您可以使用所需的任何数据库。 这里最重要的一点是,对于数据库,Express不提供任何内置的API。
水线ORM / ODM
Sails.js的一项主要功能是Waterline,它是一种功能强大的ORM(对象关系映射器),用于基于SQL的数据库,而ODM(对象文档映射器)用于基于NoSQL文档的数据库。 Waterline消除了使用数据库时的所有复杂性,最重要的是,使用Waterline时,您不必在开始开发时就决定选择数据库系统。 当您的客户尚未决定要使用的数据库技术时,它也不会吓到您。
您无需进行单行配置即可开始构建应用程序。 实际上,您一开始根本不需要安装数据库系统。 借助基于NeDB的基于Sails sails-disk的内置文件数据库,您可以透明地使用文件系统来存储和检索数据以测试应用程序功能。
准备就绪并确定要用于项目的便捷数据库系统后,可以通过为数据库系统安装相关的适配器来简单地切换数据库。 Waterline具有用于流行的关系数据库系统(例如MySQL和PostgreSQL)以及NoSQL数据库(例如MongoDB和Redis)的官方适配器 ,并且社区还为其他流行的数据库系统(例如Oracle,MSSQL,DB2,SQLite,CouchDB)构建了许多适配器。和neo4j。 万一找不到要使用的数据库系统的适配器,可以开发自己的定制适配器 。
Waterline消除了不同数据库系统之间的差异,并允许您为应用程序提供一个标准化接口,以与任何受支持的数据库系统进行通信。 您不必使用SQL或任何低级API(对于NoSQL数据库),但这并不意味着您不能(至少对于基于SQL的数据库和MongoDB)。
在某些情况下,例如由于性能原因,为了处理复杂的数据库要求或访问特定于数据库的功能而需要编写自定义SQL。 在这种情况下,可以使用仅在配置为使用SQL系统的Waterline模型上可用的.query()方法(可以从docs中找到有关query()更多信息)。
由于不同的数据库系统具有公共的和特定于数据库的功能,因此,只要您限制自己使用这些公共功能,Waterline ORM / ODM就只能对您有利。 另外,如果您使用原始SQL或本机MongoDB API,您将失去Waterline的许多功能,包括在不同数据库之间切换的功能。
Sails.js入门
现在,我们已经介绍了Sails.js的基本概念和功能,让我们看看如何快速使用Sails.js创建新项目并进行提升。
先决条件
在使用Sails.js之前,您需要具有一个已安装Node.js(和npm)的开发环境。 您可以通过访问Node.js官方网站并为您的操作系统下载正确的安装程序来安装它们。

另外,还要确保安装要与Sails.js一起使用的任何数据库管理系统(关系数据库或NoSQL数据库)。 如果您对使用成熟的数据库系统不感兴趣,那么此时仍然可以借助Sails sails-disk来使用Sails.js,这使您可以立即使用基于文件的数据库。
安装Sails.js CLI
满足工作开发要求后,您可以转到终端(Linux和macOS)或命令提示符(Windows),并从npm全局安装Sails.js命令行实用程序:
sudo npm install sails -g
如果要安装最新的1.0版本以尝试新功能,则需要使用beta版本:
npm install sails@beta -g
根据您的npm配置 ,您可能需要也可能不需要sudo来全局安装软件包。
搭建Sails.js项目
安装Sails.js CLI后,您可以继续使用一个命令来构建一个新项目:
sails new sailsdemo
这将在当前目录上为您的项目创建一个名为sailsdemo的新文件夹。 您还可以使用以下方法在现有文件夹中放置项目文件:
sails new .
您可以使用以下方法来搭建没有前端的新Sails.js项目:
sails new sailsdemo --no-frontend
在docs中找到有关CLI功能的更多信息。
Sails.js项目的剖析
这是使用Sails.js CLI生成的项目的屏幕截图:

Sails.js项目是一个带有package.json和node_modules文件夹的Node.js模块。 您可能还会注意到Gruntfile.js的存在。 Sails.js使用Grunt作为构建前端资产的构建工具。
如果您正在为浏览器构建应用程序,那么您很幸运。 Sails随Grunt一起提供-这意味着您的整个前端资产工作流程是完全可定制的,并支持所有已经存在的出色的Grunt模块。 其中包括对Less,Sass,Stylus,CoffeeScript,JST,Jade,Handlebars,Dust等的支持。 当您准备投入生产时,您的资产将被缩小并自动压缩。 您甚至可以编译静态资产并将其推送到CloudFront之类的CDN,以使您的应用程序加载更快。 (您可以在Sails.js网站上阅读有关这些方面的更多信息 。)
您还可以使用Gulp或Webpack作为自定义生成器,而不是Grunt作为构建系统。 请参阅GitHub上的sails -generate-new -gulp和sails-webpack项目。
有关更多社区生成器的信息,请参见Sails.js网站上的此文档页面 。
该项目包含许多配置文件和文件夹。 其中大多数是不言自明的,但让我们回顾一下大部分时间将要使用的内容:
-
api/controllers:这是控制器所在的文件夹。 控制器对应于MVC中的C部分。 这是您的应用程序的业务逻辑所在。 -
api/models:存在api/models的文件夹。 模型对应于MVC架构的M部分。 这是您需要放置映射到SQL / NoSQL数据的类或对象的地方。 -
api/policies:这是您需要在其中放置应用程序策略的文件夹 -
api/responses:此文件夹包含服务器响应逻辑,例如处理404和500响应的函数等。 -
api/services:您的应用范围内的服务所在的位置。 服务是封装通用逻辑的全局类,该通用逻辑可在许多控制器中使用。 -
./views:此文件夹包含用于显示视图的模板。 默认情况下,此文件夹包含ejs引擎模板,但是您可以配置任何Express支持的引擎,例如EJS,Jade,Handlebars,Mustache和Underscore等。 -
./config:此文件夹包含许多配置文件,使您可以配置应用程序的每个细节,例如CORS,CSRF保护,i18n,http,模型设置,视图,日志记录和策略等。您将要使用的一个重要文件经常使用的是config/routes.js,您可以在其中创建应用程序路由并将其映射到控制器中的实际操作或直接映射到视图。 -
./assets:这是一个文件夹,您可以在其中放置应用程序的任何静态文件(CSS,JavaScript和图像等)。
运行您的Sails.js项目
您可以通过从项目的根目录运行以下命令来启动开发服务器:
sails lift
这将提示您选择迁移策略,然后启动开发服务器。

然后,您可以使用网络浏览器导航到[http://localhost:1337/](http://localhost:1337/) 。 如果您生成了一个带有前端的Sails.js项目(即,不使用–no-frontend选项),您将看到此主页:

创建水线模型
模型是一种抽象,通常由通用编程语言中的对象或类表示,并且它引用/映射到关系数据库中的SQL表或NoSQL数据库中的文档(或键值对) 。
您可以使用Sails.js CLI创建模型:
sails generate model product
这将在api/models创建具有以下内容的Product.js模型:
/**
* Product.js
*
* @description :: TODO: You might write a short summary of how this model works and what it represents here.
* @docs :: http://sailsjs.org/documentation/concepts/models-and-orm/models
*/
module.exports = {
attributes: {
}
};
然后可以使用属性扩充模型。 例如:
module.exports = {
attributes: {
name: {
type: 'string',
defaultsTo: '',
required: 'true'
},
description: {
type: 'string',
defaultsTo: ''
},
quantity: {
type: 'integer'
},
user: { model: 'User' }
}
};
注意,我们如何定义与模型User的关联(一对多或belongsTo关系)。 您可以通过此Sails.js关联页面查看所有受支持的关联以及如何创建它们。
有关可用模型属性的更多信息,请参见Sails.js属性页面 。
您还可以通过在模型定义中添加顶级属性来为每个模型或模型设置添加配置,这将覆盖config/models.js的全局模型设置。 您可以覆盖与模型的属性,数据库连接等相关的设置。
例如,让我们为产品模型指定一个不同的数据存储,而不是在整个项目中使用的全局数据存储:
module.exports = {
connection: 'mysqlcon'
attributes: { /*...*/}
}
这将指示Sails.js使用名为mysqlcon的连接来存储此模型数据。 确保将mysqlcon连接添加到config/connections.js的连接对象:
module.exports.connections = {
// sails-disk is installed by default.
localDiskDb: {
adapter: 'sails-disk'
},
mysqlcon: {
adapter: 'sails-mysql',
host: 'YOUR_MYSQL_HOST',
user: 'YOUR_MYSQL_USER',
password: 'YOUR_MYSQL_PASSWORD',
database: 'YOUR_MYSQL_DB'
}
};
您还需要从npm安装sails-mysql适配器:
npm install sails-mysql@for-sails-0.12
您可以在Sails.js模型设置页面中找到可以指定的可用模型设置 。
Sails.js控制器
控制器拥有您应用程序的业务逻辑。 它们生活在api/controllers并提供粘合应用程序模型和视图的层。 控制器包含绑定到路由并响应来自Web /移动客户端的HTTP请求的操作。
控制器是一个JavaScript对象,其中包含称为控制器动作的方法,该方法带有两个参数:请求和响应。
您可以在Sails.js控制器页面上找到有关控制器的更多信息。
您可以使用Sails.js CLI生成控制器:
sails generate controller product
该命令将生成一个名为api/controllers/ProductController.js ,其内容如下:
/**
* ProductController
*
* @description :: Server-side logic for managing products
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers
*/
module.exports = {
};
该代码将导出一个空的JavaScript对象,您可以在其中添加新动作或覆盖默认(自动添加)的控制器动作。
此时,您实际上可以对服务器执行CRUD操作,而无需进一步添加任何代码。 由于Sails.js在配置上遵循约定,因此它将您的控制器连接到其相应的路由,并提供用于处理常见HTTP POST,GET,PUT和DELETE请求等的默认操作。
与邮递员测试
使用Postman,您可以发送POST,GET和其他请求来测试您的API,因此请继续获取适用于您操作系统的Postman版本 。 接下来,输入产品端点URL http://localhost:1337/product 。 然后选择要发送的HTTP方法-在这种情况下为POST,因为我们要创建一个Product。 接下来,您需要提供数据,因此单击“ 正文”选项卡 ,选择“ 原始”选项,然后输入以下内容:
{
"name": "Product 1",
"description": "This is product 1",
"quantity": 100
}
然后点击发送按钮:

您应该注意返回的状态码:200 OK表示成功创建了产品。

然后,您可以通过发送GET请求来验证是否创建了产品:

您还可以通过发送PUT请求按产品ID更新产品:

最后,您可以通过发送DELETE请求按产品ID删除产品:

对于自定义逻辑,您还可以覆盖这些操作并实施自己的操作。
创建API(即控制器和模型)时,Sails.js会自动添加八个默认操作,分别是:
-
add to -
create -
destroy -
find one -
find where -
populate where -
remove from -
update
Find where , find one , create , update和destroy是大多数API中需要出现的常规CRUD操作。 其他与国外记录有关:
-
add to:用于将外部记录添加到另一个记录集合(例如,将产品添加到用户的产品)。 -
populate where:用于填充并返回给定关联的另一个记录的外部记录。 在此处阅读更多信息 。 -
remove from:用于从一个相关记录收集协会(例如用户的产品)中删除外部记录(例如产品)。 在此处查看更多信息和示例 。
要自定义默认操作的行为,可以执行以下任一操作:
- 覆盖指定控制器中的操作。 也就是说,创建一个与以下操作之一具有相同名称的操作:
find,findOne,create,update,destroy,populate,add或remove。 - 覆盖所有控制器的默认操作。 您可以通过创建
api/blueprints文件夹来执行此操作,在该文件夹中,您需要为默认操作(例如find.js,findone.js,create.js等)添加小写字母的文件。 您可以通过查看Sails.js Blueprint API文档来找到有关蓝图的更多信息。
在Sails.js中路由
路由允许您将URL映射到控制器或视图。 就像默认操作一样,Sails.js会自动为默认操作添加默认路由,从而允许您通过创建模型和控制器来获得自动API。
您也可以为自定义操作或视图添加自定义路线。 要添加路由,请打开config/routes.js文件并添加以下内容:
module.exports.routes = {
'/products': {
view: 'products'
}
};
这会将/products映射到views文件夹中名为product的模板。
您可以选择将HTTP动词添加到URL。 例如:
module.exports.routes = {
'get /': {
view: 'homepage'
}
};
您也可以为路线指定控制器动作。 例如:
module.exports.routes = {
'post /product': 'ProductController.create',
};
当客户端向/product端点发送POST请求时,这告诉Sails.js调用ProductController控制器的create动作。
结论
在本文中,向您介绍了Sails.js。 我们研究了Sails.js的基本概念,以及如何生成新的Sails.js项目,然后仅通过生成模型,添加一些属性然后生成控制器来创建API。 Sails.js具有其他高级概念,例如服务 , 策略 , 蓝图和挂钩 。 一旦掌握并熟悉了本简介中的基本概念,您就可以自己进一步发现这些内容。
From: https://www.sitepoint.com/an-introduction-to-sails-js/
Sails.js是一款基于Node.js的MVC框架,支持快速构建REST API和实时应用。它采用“约定优于配置”的设计理念,简化了应用程序开发过程。本文介绍如何使用Sails.js创建新项目、配置模型与控制器,并实现基本的CRUD操作。

4万+

被折叠的 条评论
为什么被折叠?



