「翻译」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导出了几个全局对象(也就是说全局都可以访问),如
  1. sails
  1. async(解决Callback Hell的一个方案)
  1. Lodash(_)
  1. 后面即将提到的服务

路由

所谓路由(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个成员,hibye,这2个成员叫做动作Action,每个动作,都必须是一个合法的ExpressJs中间件!
动作接受2个参数,requestresponse,一般简写为req和res(sails对命名不敏感,但是位置不能换啊……),这2个对象都是经过包装好的,切具有自己的方法,分表代表HTTP请求中的请求响应,所谓处理HTTP请求,也就是根据特殊的响应,返回一个特定的请求。
特殊的,动作会默认加载到路由上面去,比如上面的,会自动变成/say/hi和/say/bye的路由
具体的方法,可以参看RequestResponse

中间件

事实上,在HTTP请求到达控制器之前,已经经过了多层的中间件Middleware处理,所谓中间件,就是……需要提前处理每个请求的各种方法,可见,中间件也必须是合法的Express中间件。
中间件在config/http.js配置,一般情况下不需要配置……sailsjs在初始化的时候,已经提供几个默认的中间件,简要的提几个:
  1. cookieParser 对穿进来的cookie字符串解密,找出信息(粉碎小饼干)
  1. session 根据cookie找到session(如果session没有接触,请务必接触一下!)
  1. bodyParser 对HTTP Body处理,比如json格式的转换成JSON这种。。
  1. 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

  1. 通过sails new 来新建一个sails app
  1. 通过sails genertator 来新建新的api model conroller……十分方便……
(...暂时写到这里吧,有问题再更新)
另外,当你有问题的时候,请先Google,如果还是不太清楚,请在下面留言,并且抄送我或者其他人,而不是在QQ群寻求帮助,这样才可以让当时不在QQ的人也可以帮助你,且其他人也可以分享这个问题。
(...END)

© 连城究 2021