2013-08-31 9 views
8

Я только что распаковал новую копию рамок узла 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.

// 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')); 

Только тогда, когда я выше, он говорит мне, что он не может найти экспресс-модуль. Я проверил, что экспресс является модулем в узлах узла Sails. Есть ли другой синтаксис для его загрузки? Я бы предпочел не устанавливать вторую копию экспресс вместе с парусами. Есть ли способ получить доступ к оригинальному экземпляру приложения Sails/Express?

ответ

17

Для достижения этой цели вы можете использовать policies. Сохраните функцию isAjax как isAjax.js в папке api/policy и измените ее, чтобы использовать только module.exports вместо module.exports.isAjax. Затем в файле конфигурации/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.(+1), но я не думаю, что буду писать это так - thx для дополнительной стрелы в нашем колчане. – Cody

4

чтобы добавить компресс промежуточное программное обеспечение курьерского, то я нахожу эту нить и

sails-middleware-example-issue очень полезны.

  1. инсталляцию выражают местные: npm install express
  2. нагрузки экспресс: var exp = require('express')
  3. добавить customMiddleware в $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:» устарел (в парусах 0.12.1) , используйте "http:" – eyn

Смежные вопросы