如何使用Sails.js自定义路由中间件? (ExpressJS)

时间:2013-08-31 13:48:52

标签: node.js express sails.js

我刚刚解压缩了Node框架Sails.js的新副本。它建立在Express 3上。在/config/routes.js文件中是这个注释:

/**
 * (1) Core middleware
 *
 * Middleware included with `app.use` is run first, before the router
 */


/**
 * (2) Static routes
 *
 * This object routes static URLs to handler functions--
 * In most cases, these functions are actions inside of your controllers.
 * For convenience, you can also connect routes directly to views or external URLs.
 *
 */

module.exports.routes = { ...

在同一个配置文件夹中,我创建了名为is_ajax.js的文件。

// Only run through API on ajax calls.
module.exports.isAjax = function(req, res, next){
  if (req.headers['x-requested-with']) {
    // Allow sails to process routing
    return next();
  } else {
    // Load main template file
    // ...
  }
};

我的目的是让非Ajax GET请求全部加载相同的模板文件,这样我的CanJS应用程序就可以根据URL设置应用程序状态(所以我的javascript应用程序可以正常加入书签)。

我想将该脚本作为中间件运行。 有人可以告诉我如何在这种情况下使用app.use()来运行is_ajax.js脚本吗?

我猜它就像

var express = require('express');
var app = express();
app.use( require('./is_ajax') );

只有当我执行上述操作时,它才会告诉我它无法找到快速模块。我已经验证了express是Sails'node_modules中的一个模块。是否有其他语法加载它?我宁愿不必在帆旁边安装第二份快递副本。有没有办法访问原始的Sails / Express应用程序实例?

3 个答案:

答案 0 :(得分:18)

您可以使用policies来实现此目的。将您的isAjax函数保存为api / policies文件夹下的isAjax.js,并将其更改为仅使用module.exports而不是module.exports.isAjax。然后在config / policies.js文件中,您可以指定要应用策略的控制器/操作 - 为每条路由运行isAjax,只需执行以下操作:

'*':'isAjax'

在该文件中。

答案 1 :(得分:10)

我有同样的问题,想弄清楚如何使用中间件。 它们基本上在config/policies.js中定义 因此,如果您想使用旧样式的中间件(又名策略),您可以执行以下操作(这可能不是最好的方式):

// config/policies.js
'*': [ 
  express.logger(),
  function(req, res, next) {
    // do whatever you want to
    // and then call next()
    next();
  }
]

然而,真正的 sailjs 方式是将所有此类政策放入api/policies/文件夹

答案 2 :(得分:4)

要添加express的压缩中间件,我找到了这个帖子和

sails-middleware-example-issue非常有用。

  1. 安装快递本地:npm install express
  2. load express:var exp = require('express')
  3. $app_dir/config/local.js
  4. 中添加customMiddleware
    express: {
        customMiddleware: function (app) {
          console.log("config of Middleware is called");
          app.use(exp.logger());
          app.use(exp.compress());
          app.use(function (req, res, next) {
            console.log("installed customMiddleware is used");
            next();
          })
        }
      }