9

我刚刚解压了 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 模块。我已经验证 express 是 Sails 的 node_modules 中的一个模块。是否有另一种加载它的语法?我宁愿不必在风帆旁边安装第二个 express 副本。有没有办法访问原始 Sails/Express 应用程序实例?

4

3 回答 3

19

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

'*':'isAjax'

在那个文件中。

于 2013-09-01T20:13:19.200 回答
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/文件夹中

于 2013-09-14T17:40:49.507 回答
4

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

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();
      })
    }
  }
于 2013-11-28T13:41:40.203 回答