Javascript express 4的奇怪动态中间件行为
我试图在express4路由中调用动态创建的中间件,但它从未被调用并创建超时Javascript express 4的奇怪动态中间件行为,javascript,node.js,express,Javascript,Node.js,Express,我试图在express4路由中调用动态创建的中间件,但它从未被调用并创建超时 'use strict'; var bodyParser = require( 'body-parser' ); var logger = require( './logger' ); var db = require( './mongoose' ); var validations = require( './validations' ); module.exports = function (app, confi
'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.post
是ValidationMiddleware
类的一个对象,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;
我尝试过调试和登录控制台,但在打印checkpost之后什么也没做。我想得到任何提示,以推动这一点。我一直在使用另一个express 3项目,它仍然在工作,但在这种情况下,一些东西引发了它。当验证文件加载模式并创建动态ValidationMiddleware
对象时,它看起来很精细,但当调用路由时,所有内容似乎都丢失了
构建方法在另一个名为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()
,因此请求不会流到下一个处理程序(您的请求验证中间件)。由于在第一个路由处理程序中没有返回响应,因此会出现超时
请尝试以下方法:
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 );
}] );
你在哪里调用ValidationMiddlewareBuilder的构建方法?天哪!我已经阅读和练习了100次,我在上面浪费了3个小时!谢谢
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 );
} );