奇怪的dynamic中间件行为与快递4

我正在尝试在express 4路由中调用一个dynamic创build的中间件,但它永远不会被调用并创build一个超时。

'use strict'; var bodyParser = require( 'body-parser' ); var logger = require( './logger' ); var db = require( './mongoose' ); var validations = require( './validations' ); module.exports = function (app, config, done) { logger.debug( "Overriding 'Express' logger" ); app.set( 'trust proxy', true ); app.set( 'x-powered-by', false ); app.use( require( 'morgan' )( 'dev', {"stream": logger.stream} ) ); app.use( bodyParser.urlencoded( {extended: true} ) ); app.post( '/api/login', [ function (req, res, next) { console.log( 'check post' ); }, validations.login.post.validate, function (req, res, next) { console.log( 'Succeful post' ); console.dir( req.user ); }] ); }; 

这里validations.login.postValidationMiddleware类的一个对象,validate方法是一个中间件,但是它永远不会被调用。

 var _ = require( 'lodash' ); var defaultOptions = { convert : true, abortEarly : false, stripUnknown: true }; function ValidationMiddleware(schema, joi) { this.arr = {}; this.joi = joi; if (!schema.options) schema.options = {}; this.options = _.clone( _.defaults( schema.options, defaultOptions ) ); if (schema.params && Object.getOwnPropertyNames( schema.params ).length > 0) this.arr['params'] = joi.compile( schema.params ); if (schema.query && Object.getOwnPropertyNames( schema.query ).length > 0) this.arr['query'] = joi.compile( schema.query ); if (schema.body && Object.getOwnPropertyNames( schema.body ).length > 0) this.arr['body'] = joi.compile( schema.body ); //this.validate = this.validate.bind( this ); } ValidationMiddleware.prototype.validate = function (req, res, next) { console.err("validate called") var parent = this; var flag = true; _.forEach( _.keys( this.arr ), function (key) { if (key == 'options') return true; var result = parent.joi.validate( req[key], parent.arr[key], parent.options ); if (result.error) { res.status( 400 ).send( { message: 'incorrect values in ' + key, data : result.error } ); flag = false; return false; } //TODO: Assign values to req[key] = result.value; } ); if (flag) next(); }; function ValidationMiddlewareBuilder(joi) { this.joi = joi; this.build = function (schema) { return new ValidationMiddleware( schema, joi ); } } module.exports = ValidationMiddlewareBuilder; 

我已经尝试debugging和日志logging到控制台,但checkpost后没有打印。 想得到任何提示,以采取这一进展。 我一直在使用这个与另一个快递3项目,它仍然工作,但在这种情况下,它把它closures。 当validation文件加载模式并创builddynamic的ValidationMiddleware对象时,似乎罚款,但是当路由被调用时,似乎都丢失了。

构build方法在名为validations.js的另一个文件中调用

  fs .readdirSync( 'routes/validations' ) .filter( function (file) { return (file.indexOf( '.' ) !== 0); } ) .forEach( function (file) { console.log( 'Loading validation file ' + file ); var models = new require( path.join( config.rootPath + '/routes/validations', file ) )( joi ); var builder = new ValidationMiddlewareBuilder( joi ); validations[file.split( '.' )[0]] = {}; _.keys( models ).forEach( function (key) { validations[file.split( '.' )[0]][key] = builder.build( models[key] ); } ) } ); module.exports = validations; 

问题是你没有在第一个路由处理程序中调用next() ,所以请求不会stream向下一个处理程序(请求validation中间件)。 既然你没有在第一个路由处理程序中返回响应,那就是你得到一个超时的原因。

试试这个:

 app.post( '/api/login', [ function (req, res, next) { console.log( 'check post' ); next(); // <---- add this }, validations.login.post.validate, function (req, res, next) { console.log( 'Succeful post' ); console.dir( req.user ); }] ); 

还FWIW,你应该能够通过多个中间件路由function,而不使用数组。 例:

 app.post( '/api/login', function (req, res, next) { console.log( 'check post' ); }, validations.login.post.validate, function (req, res, next) { console.log( 'Succeful post' ); console.dir( req.user ); } );