2013-08-31 43 views
8

我刚刚解开了Node框架Sails.js的全新副本。它是建立在快速3.在/config/routes.js文件是这样的评论:如何在Sails.js中使用自定义路由中间件? (ExpressJS)

/** 
* (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文件相同的config文件夹。

// 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应用程序实例?

回答

17

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

'*':'isAjax' 
在该文件中

9

我有同样的问题想办法如何使用中间件。 它们基本上在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/文件夹

+0

THX添加customMiddleware。(+1),但我不认为我会这样写 - thx为我们箭袋中的额外箭头。 – Cody

4

要添加快递压缩中间件,我发现这个线程和

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

  1. 安装表达地方:npm install express
  2. 负荷快递:var exp = require('express')
  3. $app_dir/config/local.js
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(); 
     }) 
    } 
    } 
+1

只需要注意 - 您不需要将Express作为依赖添加,只需在Sails中执行自定义中间件即可!在您的示例中,您正在使用自定义函数中的其他Express中间件,这很好,但如果您没有这样做,则可以跳过第1步和第2步。 – sgress454

+0

“express:”已弃用(在sails 0.12.1中) 。使用“http:” – eyn