概述

Actions是您的Sails应用程序中的主要对象,负责响应来自Web浏览器、移动应用程序或任何其他能够与服务器通信的系统的请求。Actions经常被作为你的 models 与views之间的中间人。 对于绝大部分应用,Actions将包含你的项目中一整块的 business logic.

在你的应用中action可以绑定到 routes 中所以当一个客户请求这条路由的时候,绑定的方法将被执行以完成一些业务逻辑并生成一条回应消息。比如,GET/hello路由可以绑定如下的一个方法在你的应用中:

所以任何时候一个web浏览器指向 /hello 的URL到你的app服务器,该页面会显示消息 “Hi there!”.

Actions在哪里定义?

Actions都是定义在 api/controllers/ 和子文件夹中的(稍后我们将详细讨论控制器)。为了能让Sails将它们加载为Action, 它必须是 kebab-cased (只包含小写字母、数字和破折号). 在实际的操作时 (例如, 将其绑定到路由时), 我们只要使用其相对与 api/controllers的路径而不使用任何文件扩展名. 例如,  api/controllers/user/find.js 我们只要使用 user/find就可以。

Actions的文件扩展名

除了 .md (Markdown) 和 .txt (text)Action支持任何的文件扩展名. 默认情况下, Sails只知道如何解释 .js 文件, 但您可以自定义应用程序以使用 CoffeeScript 或者 TypeScript 等内容。

Action的文件内容应该是什么?

Action文件可以使用两种格式之一:传统方法或actions2

传统方法

创建一个Sails action 的传统方法是将其声明为一个函数. 当客户端请求绑定到该action的路由时, 将使用 传入请求对象 作为第一个参数 (通常命名为 req)调用函数, 使用 传出响应对象作为第二个参数 (通常命名为 res).下面是一个按ID查找用户的示例操作函数,如果找不到用户,则显示“欢迎”视图或重定向到注册页:

actions2

另一种更结构化的方法是用更现代的(“actions2”) 语法编写action.与Sails helpers 的工作方式大致相同,通过用描述性定义 (“machine“)定义您的行为, 它本质上是 self-documenting 和 self-validating. 下面是与上面相同的操作,使用actions2格式重写:

Sails 使用 machine-as-action 模块自动创建像上面的例子一样的 route-handling的方法。 有关更多信息请看:machine-as-action docs 。

注意:machine-as-action 提供了对 请求对象的访问权 如 this.req.

使用传统的res,req方法可以减少代码量,但actions2有以下好处:

1. 代码不会直接依赖res和req,使其可以更好的复用和抽象入helpers。

2. 可以迅速决定action需要的请求参数的名字和类型,而且在action运行之前可以自动验证。

3. 可以不用分析代码而看到运行action所有可能的结果。

在一个容器中,代码可以标准化,使之可以更容易复用和修改。因为可以首先声明action的参数,可以更少可能暴露底部用例和安全漏洞。

退出标志

在一个action,helper或脚本中,默认抛出任何东西都会引发错误返回。如果想要其他的返回,就必须抛出一些特殊的标志。比如:

除了便于记忆,退出标志在循环等结构中特别有用,但是仍想以一种特殊的方式退出。

控制器

编写Sails应用最快的方法就是把各类操作都组织在controller文件中。其文件名必须以Controller结尾,包含一组操作。例如:在 api/controllers/UserController.js 文件中创建“用户控制器”,该文件包含:

您可以使用 sails generate controller 来快速创建控制器文件。

控制器的文件扩展名

除了 .md (Markdown) 和 .txt (text)Action支持任何的文件扩展名. 默认情况下, Sails只知道如何解释 .js 文件, 但您可以自定义应用程序以使用 CoffeeScript 或者 TypeScript 等内容。

 

独立操作文件

对于大型应用,使用独立的操作文件会更好。这种形式与所有操作都在一个controller文件中相比,每个操作都在api/controllers目录下有独立的文件。例如:

每个js文件都有一个包含req,res的方法或一个actions定义。

这种模式有几种优势:

1. 更容易追踪应用中的动作,只要看文件目录即可,无须查看代码。

2. 每个操作文件都很小,比较容易维护,而controller文件可能随着应用复杂变大。

3. 针对操作文件的路由更直观。

4. 可以为高级操作设计目录路由,可以用一个api/controller/index.js来绑定应用的 / 路由。

保持精简

在MVC框架的传统设计中,Sails应用的controller通常很简单,因为可复用的代码都在helper中。这样做可以在应用变得复杂时使代码更容易维护。但是,过早的把代码都移动到helper会引发一些维护问题,影响效率。

建议在使用到重复代码三次及以上时,将其移动到helper中进行复用。