将定制的Express中间件(如jQuery-File-Upload)添加到Sails.js

我仍然很难理解如何将中间件添加到sails.js。 我听说过使用policies.js,创build自定义策略,添加到local.js等,所以有人请告诉我如何将jquery-file-upload-middleware添加到sails应用程序。 提前致谢

这在以前的Sails版本中会非常困难,因为您无法控制包含自定义中间件的顺序。 在v0.10,这只是有点困难。

注意:以下内容可以与Sails(v0.10.x)的testing版一起使用 ,可以通过npm install sails@beta sails npm install sails@beta

将您自己的自定义中间件插入到Sails中就像在您的config/express.js文件中添加一个customMiddleware函数一样简单,该文件将app作为参数; 那么你可以使用你的内心的内容。 这种方法的缺点是它不能让你控制什么时候包含你的中间件。 值得注意的是,它包含 body parser之后,这对你的情况不起作用。

在最新版本的Sails中,可以通过在/config/express.js实现loadMiddleware方法来覆盖所有的中间件加载。 参数是appdefaultMiddleware (Sails通常默认包含的一组中间件函数)和defaultMiddleware (对全局Sails对象的引用)。 首先看看默认的核心实现 – 你可能想要复制相同的顺序。 所以在你的/config/express.js ,你会有这样的东西:

 var upload = require('jquery-file-upload-middleware'); // configure upload middleware upload.configure({ uploadDir: __dirname + '/public/uploads', uploadUrl: '/uploads', imageVersions: { thumbnail: { width: 80, height: 80 } } }); module.exports.express = { loadMiddleware: function(app, defaultMiddleware, sails) { // Use the middleware in the correct order app.use(defaultMiddleware.startRequestTimer); app.use(defaultMiddleware.cookieParser); app.use(defaultMiddleware.session); // Insert upload file handler app.use('/upload', upload.fileHandler()); app.use(defaultMiddleware.bodyParser); app.use(defaultMiddleware.handleBodyParserError); app.use(defaultMiddleware.methodOverride); app.use(defaultMiddleware.poweredBy); app.use(defaultMiddleware.router); app.use(defaultMiddleware.www); app.use(defaultMiddleware.favicon); app.use(defaultMiddleware[404]); app.use(defaultMiddleware[500]); } ...etc... } 

在sails.js和jQueryfile upload的情况下,我想,你可以将sails bodyParserreplace为jQueryfile upload器的post方法,从这个线程的想法:

nginx / sails.js:不完整的file upload

下面的例子对我很好。 帆0.105

 npm install blueimp-file-upload-expressjs --save npm install lodash --save 

取消注释并在文件/config/http.js中添加行:

 middleware: { cbodyParser: require('../cbodyParser')( { urls: [/\/uploads/]} ), order: [ 'startRequestTimer', 'cookieParser', 'session', 'myRequestLogger', 'cbodyParser', // intersept multipart requests 'bodyParser', 'handleBodyParserError', 'compress', 'methodOverride', 'poweredBy', '$custom', 'router', 'www', 'favicon', '404', '500' ] } 

根文件夹中的新文件/cbodyParser.js

 var _ = require('lodash'); var options = { tmpDir: __dirname + '/uploads/tmp', publicDir: __dirname + '/uploads', uploadDir: __dirname + '/uploads', uploadUrl: '/uploads/', maxPostSize: 11000000000, // 11 GB minFileSize: 1, maxFileSize: 10000000000, // 10 GB acceptFileTypes: /.+/i, inlineFileTypes: /\.(gif|jpe?g|png)$/i, imageTypes: /\.(gif|jpe?g|png)$/i, imageVersions: { width: 220, height: 220 }, accessControl: { allowOrigin: '*', allowMethods: 'POST', allowHeaders: 'Content-Type, Content-Range, Content-Disposition' }, nodeStatic: { cache: 3600 // seconds to cache served files } }; var uploader = require('blueimp-file-upload-expressjs')(options); function mime(req) { var str = req.headers['content-type'] || ''; return str.split(';')[0]; } // start jQuery file uploader here: function parseMultipart(req, res, next) { uploader.post(req, res, function (obj) { res.send(JSON.stringify(obj)); }); next(); } // check for post method in request function disable_parser(opts, req, res) { var matched = false; try { var method = null; try {method = req.method.toLowerCase();} catch(err){ /* */} if(method) { _(opts.urls).forEach(function(turl) { if (method === 'post' && req.url.match(turl)) { // console.log("matched"+ req.url); if(!matched) matched = true; };}); } } catch(err) { debug(err);/* pass */ } return matched; } // Start all stuff.. module.exports = function toParseHTTPBody(options) { options = options || {}; // NAME of anynonymous func IS IMPORTANT (same as the middleware in config) !!! return function cbodyParser(req, res, next) { if (disable_parser(options, req, res) && mime(req) == 'multipart/form-data') { // we found multipart request to /uploads, so we can use jQuery file uploader instead return parseMultipart(req, res, next); } else { return next(); } }; };