如何在 Node.js/Javascript 中的较小的嵌套函数中使用函数的参数?

How do I use the parameter of a function within a smaller, nested function in Node.js/Javascript?

我正在尝试为我的 POST 请求主体编写一个验证器函数。由于验证过程在我的项目中重复多次,因此我在 validate.js 中为此目的编写了一个函数,以便我可以在其他地方重复使用它。

这是我在 validate.js 中的函数代码,它将函数验证器作为参数,因此它可以应用于第 3 行的 req.body

module.exports = function (validator) {
    return function (req, res, next) {
        const { error } = validator(req.body); 
        if (error) return res.status(400).send(error.details[0].message);
        next();
    }
}

然后我继续使用这个函数作为 POST 方法中的中间件,例如:

router.post('/', validate(validateUser), async (req, res) => {
    ...
});

使用 validateUser 函数如下所示:

function validateUser(user) {
    const schema = {
        name: Joi.string().min(5).max(50).required(),
        email: Joi.string().min(5).max(255).required().email(),
        password: Joi.string().min(5).max(255).required(),
        class: Joi.number().min(1900).max(maxYear).required(),
        major: Joi.string().min(5).max(255).required(),
    };

    return Joi.validate(user, schema);
}

然而,这给了我一个我似乎无法修复的“非错误”功能。我怀疑这与 validator 超出了 return 函数的范围这一事实有关,因此里面的 validator 基本上是一个未声明的变量。我应该如何解决这个问题?谢谢!

这里是错误:

{"level":"error","message":"validator is not a function validator is not a function", "stack":"TypeError: validator is not a function
at D:\projects\vikingreviews\backend\middleware\validate.js:3:21
at newFn (D:\projects\vikingreviews\backend\node_modules\express-async-errors\index.js:16:20)
at Layer.handle [as handle_request] (D:\projects\vikingreviews\backend\node_modules\express\lib\router\layer.js:95:5)
at next (D:\projects\vikingreviews\backend\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (D:\projects\vikingreviews\backend\node_modules\express\lib\router\route.js:112:3)
at newFn (D:\projects\vikingreviews\backend\node_modules\express-async-errors\index.js:16:20)
at Layer.handle [as handle_request] (D:\projects\vikingreviews\backend\node_modules\express\lib\router\layer.js:95:5)
at D:\projects\vikingreviews\backend\node_modules\express\lib\router\index.js:281:22
at Function.process_params (D:\projects\vikingreviews\backend\node_modules\express\lib\router\index.js:335:12)
at next (D:\projects\vikingreviews\backend\node_modules\express\lib\router\index.js:275:10)
at Function.handle (D:\projects\vikingreviews\backend\node_modules\express\lib\router\index.js:174:3)
at router (D:\projects\vikingreviews\backend\node_modules\express\lib\router\index.js:47:12) 
at newFn (D:\projects\vikingreviews\backend\node_modules\express-async-errors\index.js:16:20)
at Layer.handle [as handle_request] (D:\projects\vikingreviews\backend\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (D:\projects\vikingreviews\backend\node_modules\express\lib\router\index.js:317:13)
at D:\projects\vikingreviews\backend\node_modules\express\lib\router\index.js:284:7"}
const express = require('express');
const app = express(),
Joi = require('joi');
maxYear = 3000;

const test = () => {
 return (req, res, next) => {
  if (req.headers['content-type'] !== 'application/json') {
    res.status(400).send('Server requires application/json')
   } else {
      next()
   }
  }
 }

function validateUser(user) {

const Schema = Joi.object({
name: Joi.string().min(5).max(50).required(),
email: Joi.string().min(5).max(255).required().email(),
password: Joi.string().min(5).max(255).required(),
class: Joi.number().min(1900).max(maxYear).required(),
major: Joi.string().min(5).max(255).required(),
});
 console.log("Error", Schema.validate(Schema, user).error)
 return Schema.validate(user);
}

module.exports = validate = function (validator) {
  return function (req, res, next) {
  const { error } = validator(req.body);
    if (error) return res.status(400).send(error.details[0].message);
     next();
  }
 }

 app.post('/test', validate(validateUser), async (req, res) => {
   console.log("Testing")
  });


 app.post('/', test(), (req, res, next) => {
    res.send('You sent JSON in the request');
  })

  app.listen(3000);

您需要像我对您的其中一个函数所做的那样定义验证函数。

你能试试这个吗-

router.post('/', validate((user) => {
    const schema = {
        name: Joi.string().min(5).max(50).required(),
        email: Joi.string().min(5).max(255).required().email(),
        password: Joi.string().min(5).max(255).required(),
        class: Joi.number().min(1900).max(maxYear).required(),
        major: Joi.string().min(5).max(255).required(),
    };

    return Joi.validate(user, schema);
}), async (req, res) => {
    res.send('OK');
});

这是因为我怀疑是否看到了您没有正确传递 validateUser 方法的错误消息。这样我们直接传递函数并确认错误是否是因为您以错误的方式传递了验证器函数