【问题标题】:How to fix ' ValidationError: users validation failed: name: Path `name` is required.' error in Mongo?如何修复“验证错误:用户验证失败:名称:需要路径‘名称’。”蒙古错误?
【发布时间】:2019-11-30 17:24:11
【问题描述】:

我正在创建一个新用户并检查用户电子邮件以前是否存在。如果不是,那么它正在创建一个新用户并保存它。我需要什么来纠正我收到的这个验证错误?

我已经尝试过将名称设置为不需要。但是还是不行。

这是我的用户模型。

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

//Declaring User Model
const UserSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  },
  avatar: {
    type: String
  },
  date: {
    type: Date,
    default: Date.now
  }
});

module.exports = User = mongoose.model("users", UserSchema);

这是用户路线。

router.post("/register", (req, res) => {
  User.findOne({ email: req.body.email }).then(user => {
    if (user) {
      return res.status(400).json({ email: "email already exists" });
    } else {
      const avatar = gravatar.url(req.body.email, {
        s: "200", //size
        r: "pg", //rating
        d: "mm" //default
      });
      const newUser = new User();
      const newUser = {
        name: req.body.name,
        email: req.body.email,
        avatar,
        password: req.body.password
      };
      bcrypt.genSalt(10, (err, salt) => {
        bcrypt.hash(newUser.password, salt, (err, hash) => {
          if (err) throw err;
          newUser.password = hash;
          newUser
            .save()
            .then(user => res.json(user))
            .catch(err => console.log(err));
        });
      });
    }
  });
});

我期待它被存储。这是我遇到的错误。

{ ValidationError: users validation failed: name: Path `name` is required.
    at ValidationError.inspect (G:\devconnector\node_modules\mongoose\lib\error\validation.js:59:24)
    at formatValue (internal/util/inspect.js:493:31)
    at inspect (internal/util/inspect.js:191:10)
    at Object.formatWithOptions (util.js:84:12)
    at Console.(anonymous function) (console.js:191:15)
    at Console.log (console.js:202:31)
    at newUser.save.then.catch.err (G:\devconnector\routes\api\users.js:39:35)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  errors:
   { name:
      { ValidatorError: Path `name` is required.
          at new ValidatorError (G:\devconnector\node_modules\mongoose\lib\error\validator.js:29:11)
          at validate (G:\devconnector\node_modules\mongoose\lib\schematype.js:1034:13)
          at G:\devconnector\node_modules\mongoose\lib\schematype.js:1088:11
          at Array.forEach (<anonymous>)
          at SchemaString.SchemaType.doValidate (G:\devconnector\node_modules\mongoose\lib\schematype.js:1043:14)
          at G:\devconnector\node_modules\mongoose\lib\document.js:2133:9
          at process._tickCallback (internal/process/next_tick.js:61:11)
          message: 'Path `name` is required.',
          name: 'ValidatorError',
          properties: [Object],
          kind: 'required',
          path: 'name',
          value: undefined,
          reason: undefined,
          [Symbol(mongoose:validatorError)]: true } },
          _message: 'users validation failed',
          name: 'ValidationError' }

【问题讨论】:

  • have already tried by setting name as not required. But it still does not work. 请仔细检查错误消息是否与您将 required 设置为 false 时相同。看起来类似的错误之后,它可能会引发与密码相关的错误。
  • 抛出同样的错误。

标签: node.js mongodb express mongoose


【解决方案1】:

在您的代码中,我可以看到您将 newUser 设置为 User() 模型对象,然后将其设置为纯 JavaScript 对象。这在语法上也是错误的。

基本上你需要用这些值制作模型对象。

const newUser = new User({
   name: req.body.name,
   email: req.body.email,
   avatar,
   password: req.body.password
});

【讨论】:

  • 好眼光。奇怪的是它没有抛出与const重新声明相关的错误
  • 是的,当我更改模型时它现在可以工作了。但你能告诉我更多这是关于什么的吗?
  • 你没有制作模型实例,你只是制作了一个普通的 javascript 对象。模型是一个具有属性和方法的类,例如 .save(),当您制作 newUser = {..} 时,这只是一个 Object 文字,而不是具有所有这些功能的 Model 类。
  • 好的,知道了。非常感谢你的帮助。 @AritraChakraborty
【解决方案2】:

解决方案非常简单,现在和将来都避免使用附加参数,您不需要它们

const userSchema = mongoose.Schema({
    email: String,
    username: String,
    password: String,
    googleId:   String,
    avatar_url: String,
});

【讨论】:

    【解决方案3】:

    确保您的 api 帖子正文包含正确的 json 键和值对,以便根据 mongoose 模型创建新文档。

    【讨论】:

      【解决方案4】:

      遇到类似问题,通过在app.js 中添加这些行得到解决:

      app.use(
          express.urlencoded({ extended: true })
      );
          
      app.use(express.json());
      

      【讨论】:

        猜你喜欢
        • 2019-12-18
        • 2023-02-26
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        相关资源
        最近更新 更多