2013-08-31 56 views
8

Tôi vừa mới giải nén một bản sao mới của khung Node Sails.js. Nó được xây dựng trên Express 3. Trong tập tin /config/routes.js là bình luận này:Làm thế nào để sử dụng middleware tuyến tùy chỉnh với 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 = { ... 

Trong cùng thư mục cấu hình tôi đã tạo tập tin gọi là 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 
    // ... 
    } 
}; 

mục đích của tôi là để làm cho phi Ajax GET yêu cầu tất cả các tải các tập tin cùng một mẫu để ứng dụng CanJS tôi có thể thiết lập các trạng thái ứng dụng dựa trên URL (để ứng dụng javascript của tôi là đánh dấu-thể đúng).

Tôi muốn chạy tập lệnh đó làm phần mềm trung gian. Có thể ai đó vui lòng chỉ cho tôi cách sử dụng app.use() trong trường hợp này để chạy tập lệnh is_ajax.js trước khi định tuyến khác không?

Tôi đoán nó là cái gì như

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

Chỉ khi tôi làm các việc trên, nó nói với tôi rằng nó không thể tìm thấy các mô-đun nhanh. Tôi đã xác minh rằng Express là một mô-đun bên trong node_modules của Sails. Có cú pháp khác để tải nó không? Tôi không muốn phải cài đặt một bản sao thứ hai của express cùng với buồm. Có cách nào để truy cập phiên bản ứng dụng Sails/Express gốc không?

Trả lời

17

Bạn có thể sử dụng policies để đạt được điều này. Lưu hàm isAjax của bạn dưới dạng isAjax.js trong thư mục api/policies của bạn và thay đổi nó thành chỉ sử dụng module.exports thay vì module.exports.isAjax. Sau đó, trong tập tin cấu hình/policies.js của bạn, bạn có thể chỉ định điều khiển/hành động để áp dụng chính sách này để - để chạy isAjax cho mỗi tuyến đường, chỉ cần làm:

'*':'isAjax' 

trong tập tin đó.

9

Tôi có cùng một vấn đề về cách tìm hiểu cách sử dụng phần giữa. Về cơ bản, chúng được xác định trong config/policies.js.
Vì vậy, nếu bạn muốn sử dụng middlewares (aka chính sách) như phong cách cũ, bạn có thể làm như sau (điều này có thể không phải là cách đẹp nhất):

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

Tuy nhiên, thực sailjs cách là đặt tất cả các chính sách như vậy trong thư mục api/policies/

+0

Thx.(+1) nhưng tôi không nghĩ rằng tôi sẽ viết nó theo cách đó - thx cho mũi tên thêm trong rung động của chúng tôi mặc dù. – Cody

4

để thêm nén middleware của nhanh, tôi thấy chủ đề này và

sails-middleware-example-issue rất hữu ích.

  1. cài đặt thể hiện địa phương: npm install express
  2. tải nhanh: var exp = require('express')
  3. thêm customMiddleware trong $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

Chỉ cần lưu ý - bạn không cần phải thêm Express làm phụ thuộc chỉ để thực hiện phần mềm trung gian tùy chỉnh trong Sails! Trong ví dụ của bạn, bạn đang sử dụng các phần mềm trung gian Express khác trong chức năng tùy chỉnh của bạn, điều đó là tốt, nhưng nếu bạn không làm điều đó thì bạn có thể bỏ qua bước 1 và 2. – sgress454

+0

"express:" không được chấp nhận (trong các bản 0.12.1) . sử dụng "http:" – eyn