Sails.js简介
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简介相关推荐
- Zepto.js简介
Zepto.js简介 一.总结 一句话总结: Zepto.js语法和jquery起码百分之90相似,主要做移动端框架,和jquery mobile是一个类型的概念 1.Zepto.js做移动端的特点? ...
- 【Nodejs篇一】Node js 简介
一.Node.js简介 Node.js 不是一种独立的语言,Node.js 也不是一个 JavaScript 框架,.Node.js 是一个让 JavaScript 运行在服务端的开发平台.他跳过了h ...
- 老web换新枝----Sails.js移动设备的全新生产力(五)
自定义模型操作 目前为止,我们的进展非常顺利,我们使用了 Sails 的默认路由来访问或修改模型实例.这些默认设置(包含在 Sails Blueprint API 中)负责我们期望从 Web 或移动应 ...
- 前端之JS篇(一)——计算机基础JS简介
1.计算机基础 1.1 编程语言 编程:就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 计算机程序:就是计算机所执行的一系列的指令集合,而程序全部都是用我们所掌握 ...
- 1.js简介,JavaScript的组成,js环境搭建
js简介 Js原名javaScript,是一种解释性的脚本语言,与java没有关系,是一种动态的,弱类型,基于原型继承的语言,内置支持类型; 他的解释器被称为javaScript引擎,作为浏览器的一部 ...
- Node.js简介、安装Node.js、ES6中的模块
一.Node.js简介 1. Node是什么 1)浏览器内核有两个引擎:渲染引擎(渲染html.css).JavaScript引擎(运行JavaScript代码) 2)Node是独立于浏览器的Java ...
- P01:Next.js简介和创建项目
React服务端渲染框架Next.js Next.js 简介 创建Next.js项目 一.手动创建Next.js项目 建立文件夹 安装所需要的依赖包 增加快捷命令 创建pages文件夹和文件 二.cr ...
- “流式”前端构建工具——gulp.js 简介
Grunt 一直是前端领域构建工具(任务运行器或许更准确一些,因为前端构建只是此类工具的一部分用途)的王者,然而它也不是毫无缺陷的,近期风头正劲的 gulp.js 隐隐有取而代之的态势.那么,究竟是什 ...
- Node.js「一」—— Node.js 简介 / Node.js 模块 / 包 与 NPM
本文为 Node.js 系列笔记第一篇.文章参考:nodejs 教程 -- 大地:<深入浅出 Node.js>:阮一峰 nodejs 博客 文章目录 一.Node 简介 1. 简单介绍 2 ...
- NW.js 简介与使用
简介 (1)以网络最流行的技术编写原生应用程序的新方法 (2)基于HTML5, CSS3, JS and WebGL而编写 (3)完全支持nodejs所有api及第三方模块 (4)可以使用DOM直接调 ...
最新文章
- Android 简单记事本
- matlab 小技巧
- boost::geometry::is_empty用法的测试程序
- Linux下crontab乱码,Linux下crontab自动运行Java程序乱码解决方案
- 入坑-DM导论-第一章绪论笔记
- 正则表达式中的分组的匹配次数的理解
- .Net 调用wordCOM组件转PDF
- 充分掌握网络工作原理及底层实现 大家都做什么项目啊?
- html5中标签与类的区别,html5中section标签与div标签的区别是什么
- 【BZOJ 1503】郁闷的出纳员【权值线段树】
- 19.猜数字的游戏:随机生成数字与输入数字进行比较
- 转:Mac操作技巧 | 键盘侠必备快捷键
- python 读取asc文件_Python——文件读取与写入
- 零基础如何入门嵌入式领域
- 企查查爬取返回405错误的一种处理方法
- 光纤验收测试标准、参数及常用设备
- 【网络通讯与网络安全】网络通讯中的随机数如果不随机会怎么样?(RT-Thread技术论坛优秀文章)
- 又修改了显示器和电源机箱的配置
- Ijkplayer Android介绍
- 基于51单片机的数字电子钟万年历闰年判断闹钟设计
热门文章
- 注册时出现服务器错误,创建Apple ID时出现服务器错误,导致无法完成注册是什么原因...
- Accelerate Activity Tracker隐私政策
- json文件是什么?
- 【手把手带你搞定】第一个C语言猜数字游戏(超详细教程,不仅学如何写代码,更学方法思路!)
- 运维工程师社招、校招面试经验汇总
- Spring系列九:Spring 事务
- Java Web 开发后续(二)
- Python 打新股,我建议你这么来操作!
- 专访北京中医药大学副教授郭凤英:产学合作,为新医科培养复合型人才
- html编辑器如何设置滚动字幕,使用Axure RP为网页添加滚动字幕的具体操作步骤