「翻译」Sailjs 文档
date
Jan 1, 2015
slug
translate-sails
status
Published
tags
Computer
summary
type
Post
使用准备
此文档基本上是官方文档的精简翻译,切可能存在大量错误……如果有请戳我
Sails基于Nodejs,所以请首先安装nodejs,具体步骤在此忽略。
NPM是Nodejs的包管理器(不懂什么是包管理器的面壁去),如果你在使用NPM的时候速度很慢,请使用淘宝的CNPM,或者翻墙使用。注意,有些时候,NPM会要求管理员权限。
Sails概念解释
各种概念相互交叉……所以……加油……
MVC框架
不懂MVC的自行面壁
全局对象
sails导出了几个全局对象(也就是说全局都可以访问),如
- sails
- async(解决Callback Hell的一个方案)
- Lodash(_)
- 后面即将提到的服务
路由
所谓路由(Route),就是指导路(汗……),也就是基于URL的寻路,在sailsjs中,路由在
config/routes.js
下配置,配置采用如下格式:module.exports = {
'get /signup': { view: 'conversion/signup' },
'post /signup': 'AuthController.processSignup',
'get /login': { view: 'portal/login' },
'post /login': 'AuthController.processLogin',
'/logout': 'AuthController.logout',
'get /me': 'UserController.profile'
}
稍微解释一下,module.exports是导出一个模块,注意,Nodejs是CommonJS加载,所以导出模块只能这样。补充一下,导出这个模块之后,可以在其他的文件,通过require来加载这个模块。
这个路由对象,key(左值)是一个路由字符串,可以直接是路径,也可以是HTTP请求类型+路径。
value(右值)可以是一个动作(Action)(这个之后解释),也可以是一个redirect,也可以是一个具体的HTML模板。表示,把这个HTTP请求交给对应的东西处理。
控制器
控制器(Controller)是MVC的C部分,sailsjs中,控制器在
api/controllers
目录下,请注意,命名必须为UpperCamelCase型(不懂的自行Google),且必须为NameController,(注意,sails大部分命名都采用这个格式),代码如下所示://SayController.js
module.exports = {
hi: function (req, res) {
return res.send("Hi there!");
},
bye: function (req, res) {
return res.redirect("http://www.sayonara.com");
}
};
动作
上述代码定义了一个叫Say的Controller,这个对象有2个成员,
hi
和bye
,这2个成员叫做动作Action,每个动作,都必须是一个合法的ExpressJs中间件!动作接受2个参数,
request
和response
,一般简写为req和res(sails对命名不敏感,但是位置不能换啊……),这2个对象都是经过包装好的,切具有自己的方法,分表代表HTTP请求中的请求与响应,所谓处理HTTP请求,也就是根据特殊的响应,返回一个特定的请求。特殊的,动作会默认加载到路由上面去,比如上面的,会自动变成/say/hi和/say/bye的路由
中间件
事实上,在HTTP请求到达控制器之前,已经经过了多层的中间件Middleware处理,所谓中间件,就是……需要提前处理每个请求的各种方法,可见,中间件也必须是合法的Express中间件。
中间件在
config/http.js
配置,一般情况下不需要配置……sailsjs在初始化的时候,已经提供几个默认的中间件,简要的提几个:- cookieParser 对穿进来的cookie字符串解密,找出信息(粉碎小饼干)
- session 根据cookie找到session(如果session没有接触,请务必接触一下!)
- bodyParser 对HTTP Body处理,比如json格式的转换成JSON这种。。
- router 路由中间件
等等……
模型
- *模型(model)**就是对于数据库的面向对象封装,也就是说,不需要再写SQL语句,而是只需要调用模型自己的方法。
更近一步,sails采用waterline做了ORM,也就是说,模型只需要写一次,但是可以在不同的数据库使用,甚至可以跨越多个数据库,但是对数据的CURD都是一样的!!!
模型在
api/model
目录下定义,只需要写名字就可以,如module.exports = {
//User.js
connection: 'mongoDataBase',
attributes: {
email: {
type: 'string',
unique: true
},
password: {
type: 'string'
},
organization: {
type: 'string'
},
channel: {
type: 'array'
}
}
};
模型除了可以定义属性attribute,还可以定义模型的方法,这里不再赘述。
注意,模型对于动作是可见的,也就是说,在Action里面,你不需要导入这个对象就可以使用(比如User对象……),初次之外,sails事先定义了基本的模型方法,比如create,find等……这里也不再赘述
策略
有时候,动作需要一些可以重复的行为,比如验证登录,但是这些行为并不是全局的,这个时候可以定义策略Policy,既针对于个别动作的公用方法。
所以策略也是一个合法的Express中间件,特殊的是,在进入这个策略之后,还需要进入下一层(也就是动作),继续完成请求,所以需要next进入下一层(这个是通过Generator 解决 Callback Hell的策略)。策略在
api/policies
下定义,为camelCase,比如module.exports = function(req, res, next) {
if (req.session.authenticated) {
return next();
}
return res.forbidden('You are not permitted to perform this action.');
};
策略定义了,需要在
config/policies.js
使用,切只能针对动作:
{
SayController: {
hi: ['isAdmin', 'isLoggedIn'],
bye: 'isLoggedIn'
}
}
自定义响应
除了策略这种,需要提前处理req对象,还有一些时候,我们需要一些公共的,对res的方法,这个时候就需要自定义响应。
请咨询查阅官方文档。
服务
服务是一个单例对象(大概),可以在全局获取,用于管理某些对象,或者方法的重用。
在
api/services
下定义,可以在全局调用。(此处去看文档去……不写了)测试
测试采用,mocha,暂时忽略……(我也不想写啦)
Websocket
sails集成socket.io,支持强大的websocket。
通常情况下,只需要在前端集成assets下的sails.io.js就可以使用……当然需要做好session验证等等(sails最恶心的就是session和socket密不可分)
使用sailsjs
- 通过sails new 来新建一个sails app
- 通过sails genertator 来新建新的api model conroller……十分方便……
(...暂时写到这里吧,有问题再更新)
另外,当你有问题的时候,请先Google,如果还是不太清楚,请在下面留言,并且抄送我或者其他人,而不是在QQ群寻求帮助,这样才可以让当时不在QQ的人也可以帮助你,且其他人也可以分享这个问题。
(...END)