概述:

任何Web应用程序最基本的功能都是能够解释发送到URL的请求,然后发送回响应。为了做到这一点,应用程序必须能够区分一个URL和另一个URL。

与大多数Web框架一样,Sails提供了一个路由器:一种将URL映射到操作和视图的机制。路由是一种规则,告诉Sails在遇到新的请求时该做什么。Sails上有两种主要的路由类型:自定义(或“明确的”)和自动(或“不明确的”)。

自定义路由

Sails让你自己用你自己喜欢的方法设计你的app的URLs–也就是没有框架限制。

每一个Sails的工程都带有 config/routes.js, 一个简单的 Node.js module 可以到处一个自定义的对象或者明确的路由.比如,下面的这个routes.js文件定义了6条路由;它们有些指向一个控制器的动作,其他的一些直接指向视图。

每一条route都包含一个地址 (最左边的字符串,比如 'get /me')和一个目的地(最右边的字符串,比如 'UserController.profile')这个地址是一个URL路径并且(可选地)带有一个专用的HTTP method.目标可以被定义为各种不同的方法 (see the expanded concepts section on the subject),但是上面的两种不同的方法是最常见的。当Sails收到一条请求时,它会检测所有自定义的路由的地址并找到匹配的那条。如果匹配的路由找到了那么将会将这条请求传给目标

比如,我们读取 'get /me': 'UserController.profile' 会是这样子的:

“Hey Sails, when you receive a GET request to http://mydomain.com/me, run the profile action of UserController, would’ya?”

如果我们想改变路由本身自己的视图布局时该怎么办?很简单,只需这样:

注意:

  • Just because a request matches a route address doesn’t necessarily mean it will be passed to that route’s target directly. For instance, HTTP requests will usually pass through some middleware first. And if the route points to a controller action, the request will need to pass through any configured policies first. Finally, there are a few special route options which allow a route to be “skipped” for certain kinds of requests.
  • The router can also programmatically bind a route to any valid route target, including canonical Node middleware functions (i.e. function (req, res, next) {}). However, you should always use the conventional route target syntax when possible- it streamlines development, simplifies training, and makes your app more maintainable.

自动化的路由

除了你自定义的路由,Sails还自动地帮你绑定了许多路由。如果一条URL不匹配任何自定义的路由,它可能会匹配上自动路由中的一条,那么还是会生成一条响应的。在Sails中主要类型的自动化路由如下:

未处理的请求

如果没有与请求URL匹配的自定义或自动路由,则帆将发送一个默认404响应. 可以通过向应用程序添加 api/responses/notFound.js 文件来定制此响应. 有关详细信息,请参阅自定义响应

处理程序中遇到未处理的错误

如果在处理请求的过程中抛出未处理的错误 (例如,在某些操作代码,SAILS将发送一个默认的500响应. 可以通过向应用程序添加 api/responses/serverError.js 文件来定制此响应。有关详细信息,请参阅自定义响应

支持的协议

Sails路由器是“protocol-agnostic”;它知道如何处理 HTTP requests 和通过 WebSockets发送的消息.它通过监听Socket.io消息来实现,该消息以一种简单的格式发送给保留的event handlers,该格式称为JWR(JSON-Websocket Request/Response)。详细说明和实现参考现在可用的文档 client-side socket SDK.

注意

  • 高级用户也许会完全地绕过路由器然后直接地发送底层的完全自定义的WebSocket消息给底层的Socket.io服务器。你可以在你的app的onConnect函数(位于config/sockets.js文件中)中直接绑定你的套接字事件。但是记住在大部分的情况下,你最好放弃利用请求拦截器来进行套接字通信–因为在HTTP和WebSockets之间维护一直的路由会让你的app变得更加可维护性。