在sailsjs中指定路由

时间:2015-12-08 08:35:41

标签: node.js sails.js

我对sails.js中的路由有疑问。 所以,我正在关注制作登录页面的教程。它包括 AuthController.js

module.exports = {
    login: function(req , res){
        res.view('login'); //view login page
    },

    authenticate: function(req, res) {
        //some auth function
    }
};

login.ejs

<div id="login">
    <form align="center" action="/login" method="post">
    <ul>
        <li>
        <input type="text" name="username" placeholder="Username"></li>
        <li>
        <input type="password" name="password" placeholder="Password" ></li>
        <li>
        <input type="submit" value="Log In"></li>
    </ul>
    </form>
</div>

最后,这让我对routes.js感到困惑。为什么会这样?

  'get /login': {
    controller: 'AuthController',
    action: 'login'
  },

  'post /login' : {
    controller: 'AuthController',
    action: 'authenticate'
  },

但这不是(我删除了获取)?

  '/login': {
    controller: 'AuthController',
    action: 'login'
  },

  'post /login' : {
    controller: 'AuthController',
    action: 'authenticate'
  },

当我使用后面的路线时,似乎在我输入用户名密码时永远不会调用authentication动作,它只是将我重新定向到登录页面(它正在调用login动作)。

3 个答案:

答案 0 :(得分:3)

来自sails documentation

If no verb is specified, the target will be applied to any request that matches 
the path, regardless of the HTTP method used (GET, POST, PUT etc.).


URLs are matched against addresses in the list from the top down.

此顺序也是从上到下。因此,当您尝试在/login中发帖时,它会再次转到/login而不是POST /login

希望这会有所帮助。

答案 1 :(得分:1)

正如其他人所说,这是因为路线按顺序进行比较,先触发相应的匹配。

有趣的是,这意味着如果你交换订单,它就像你描述的那样工作:

'post /login' : {
  controller: 'AuthController',
  action: 'authenticate'
},
'/login': {
  controller: 'AuthController',
  action: 'login'
},

答案 2 :(得分:0)

在帆Js中,route.js由一个地址(在左边,例如'get / login')和一个目标(在右边,例如'AuthController.login')组成。地址是URL路径和(可选)特定HTTP方法。当Sails收到传入请求时,它会检查所有自定义路由的地址以进行匹配。如果找到匹配的路由,则将请求传递给其目标。

现在,当您删除get选项时,&amp;解除你的应用程序,&amp;导航到/ login,首先渲染登录页面,但是当表单被发布时,由于您省略了get请求,它无法区分b / w请求,因此它再次调用/ login&amp;从来没有到达后路线。

参考:Third focus image