Javascript Express v4自定义Joi中间件未传递请求、响应和下一步

Javascript Express v4自定义Joi中间件未传递请求、响应和下一步,javascript,typescript,express,joi,Javascript,Typescript,Express,Joi,我正在尝试创建一个定制的中间件函数来与Joi一起使用,我将把它放在我可以传递Joi模式进行验证的路由上 我以前做过用于检查JWTs的中间件,但这些中间件没有传递参数,所以很好 设置路由并传递中间件功能 app.route('/identity').post([validator(identitySchema)], this.identityController.createIdentity); export const validator = (schema: object) => {

我正在尝试创建一个定制的中间件函数来与Joi一起使用,我将把它放在我可以传递Joi模式进行验证的路由上

我以前做过用于检查JWTs的中间件,但这些中间件没有传递参数,所以很好

设置路由并传递中间件功能

app.route('/identity').post([validator(identitySchema)], this.identityController.createIdentity);
export const validator = (schema: object) => {
  return async (req: Request, res: Response, next: NextFunction): Promise<void> => {
    console.log('req: ' + req.body); //outputs req: [object Object]
    console.log('schema: ' + schema); //outputs schema: [object Object]
    //DO VALIDATION HERE
  };
};
验证程序中间件功能

app.route('/identity').post([validator(identitySchema)], this.identityController.createIdentity);
export const validator = (schema: object) => {
  return async (req: Request, res: Response, next: NextFunction): Promise<void> => {
    console.log('req: ' + req.body); //outputs req: [object Object]
    console.log('schema: ' + schema); //outputs schema: [object Object]
    //DO VALIDATION HERE
  };
};

它会拾取请求、res等

这是我的中间件Joi验证器

在我的路线上

import express from 'express'
import checkJoi from '../middlewares/check-joi'
import Joi from '@hapi/joi'

const router = new express.Router()

const schemaIndex = Joi.object({
  addressId: Joi.number().required(),
  products: Joi.array().items(
    Joi.object().keys({
      id: Joi.number().required(),
      quantity: Joi.number().required()
    })
  ).required()
})

router.post('/', checkJoi(schemaIndex), myController.requestUser)


export default router
中间件Joi验证器

export default (schema) => {
  return (req, res, next) => {
    const { error } = schema.validate(req.body)
    const valid = error == null
    if (valid) {
      next()
    } else {
      const { details } = error
      const errorsDetail = details.map(i => i.message)
      res.status(422).json({
        status: false,
        error: errorsDetail
      })
    }
  }
}


我希望,我已经帮了你

hmm,我不是在使用express.Router,而是在express.Application上设置路由。不确定这是否会导致问题。它应该也能工作,请尝试路由中的远程[],
验证程序(identitySchema)
,或者问题是中间件中的be return async函数,为什么要这样做?验证程序joi不必这样做。我的英语不是很好,很抱歉。是的,你是对的,它正在工作,我期待不同的输出,我也在使用joi软件包,而不是新的@hapi/joi及其打字。我想我现在明白了,我不知道为什么你的
模式
类型是
对象
,因为从我的类型脚本
对象
是错误的,所以我把它改成
任何
。export-const-validator=(schema:any)=>{…}并且工作正常。