Mongoose:需要验证错误路径

时间:2015-07-27 21:30:22

标签: javascript node.js mongodb mongoose

我正在尝试使用mongoose在mongodb中保存新文档,但即使我提供电子邮件,密码哈希和用户名,我也会收到ValidationError: Path 'email' is required., Path 'passwordHash' is required., Path 'username' is required.

这是用户架构。

    var userSchema = new schema({
      _id: Number,
      username: { type: String, required: true, unique: true },
      passwordHash: { type: String, required: true },
      email: { type: String, required: true },
      admin: Boolean,
      createdAt: Date,
      updatedAt: Date,
      accountType: String
    });

这就是我创建和保存用户对象的方式。

    var newUser = new user({

      /* We will set the username, email and password field to null because they will be set later. */
      username: null,
      passwordHash: null,
      email: null,
      admin: false

    }, { _id: false });

    /* Save the new user. */
    newUser.save(function(err) {
    if(err) {
      console.log("Can't create new user: %s", err);

    } else {
     /* We succesfully saved the new user, so let's send back the user id. */

    }
  });

那么为什么mongoose会返回验证错误,我不能将null用作临时值吗?

8 个答案:

答案 0 :(得分:14)

回应您的上次评论。

你是正确的,null是一个值类型,但是null类型是告诉解释器它没有值的一种方式。因此,您必须将值设置为任何非空值,否则您将收到错误。在您的情况下,将这些值设置为空字符串。即。

var newUser = new user({

  /* We will set the username, email and password field to null because they will be set later. */
  username: '',
  passwordHash: '',
  email: '',
  admin: false

}, { _id: false });

答案 1 :(得分:2)

嗯,以下方法是我如何摆脱错误。我有以下架构:

var userSchema = new Schema({
    name: {
        type: String,
        required: 'Please enter your name',
        trim: true
    },
    email: {
        type: String,
        unique:true,
        required: 'Please enter your email',
        trim: true,
        lowercase:true,
        validate: [{ validator: value => isEmail(value), msg: 'Invalid email.' }]
    },
    password: {
        type: String/
        required: true
    },
    // gender: {
    //     type: String
    // },
    resetPasswordToken:String,
    resetPasswordExpires:Date,
});

并且我的终端向我发送以下日志,然后在调用我的寄存器函数时进入无限重新加载:

  

(node:6676)UnhandledPromiseRejectionWarning:未处理的承诺   rejection(拒绝id:1):ValidationError:密码:路径   password是必需的。,电子邮件:电子邮件无效。

     

(node:6676)[DEP0018]弃用警告:未处理的拒绝承诺   不推荐使用。在未来,承诺拒绝未处理   将使用非零退出代码终止Node.js进程。

所以,正如它所说的路径密码'是必填项,我评论了我的模型中的required:true行以及我的模型中的validate:email行。

答案 2 :(得分:2)

我在寻找解决同一问题的方法时遇到了这个帖子-验证错误,即使值已传递到主体中。 原来我错过了bodyParser

const bodyParser = require("body-parser")

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

最初我没有包含bodyParser,因为应该将其包含在最新版本的express中。添加以上两行可以解决我的验证错误。

答案 3 :(得分:1)

我也遇到了同样的错误

import mongoose from 'mongoose';

const orderSchema = mongoose.Schema(
  {
    user: {
      type: mongoose.Schema.Types.ObjectId,
       required: true,
      ref: 'User',
    },
    orderItems: [
      {
        name: { type: String, required: true },
        qty: { type: Number, required: true },
        image: { type: String, required: true },
        price: { type: Number, required: true },
        product: {
          type: mongoose.Schema.Types.ObjectId,
          required: true,
          ref: 'Product',
        },
      },
    ],
    shippingAddress: {
      address: { type: String, required: true },
      city: { type: String, required: true },
      postalCode: { type: String, required: true },
      country: { type: String, required: true },
    },
    paymentMethod: {
      type: String,
      required: true,
    },
    paymentResult: {
      id: { type: String },
      status: { type: String },
      update_time: { type: String },
      email_address: { type: String },
    },
    taxPrice: {
      type: Number,
      required: true,
      default: 0.0,
    },
    shippingPrice: {
      type: Number,
      required: true,
      default: 0.0,
    },
    totalPrice: {
      type: Number,
      required: true,
      default: 0.0,
    },
    isPaid: {
      type: Boolean,
      required: true,
      default: false,
    },
    paidAt: {
      type: Date,
    },
    isDelivered: {
      type: Boolean,
      required: true,
      default: false,
    },
    deliveredAt: {
      type: Date,
    },
  },
  {
    timestamps: true,
  }
);

const Order = mongoose.model('Order', orderSchema);

export default Order;

以下是我终端中的错误:

<块引用>

消息:“订单验证失败:用户:路径 user 是必需的。”

我所做的只是从用户那里删除了 required 并且一切正常。

答案 4 :(得分:0)

要解决此类错误

ValidationError: Path 'email' is required.

您的电子邮件在Schema中设置为必需,但未指定任何值或未在模型上添加电子邮件字段。

如果您的电子邮件值可能为空,请在模型中设置默认值,或在validatior中设置allow(“”)。 喜欢

 schemas: {
    notificationSender: Joi.object().keys({
        email: Joi.string().max(50).allow('')
    })
  }

我认为可以解决此类问题。

答案 5 :(得分:0)

对我来说,快速而肮脏的解决方法是从我的输入表单字段中删除SELECT vendor, sum(qty * price) FILTER (WHERE location = 'CA'), sum(qty * price) FILTER (WHERE location = 'US') FROM atable GROUP BY vendor;

之前,encType="multipart/form-data"
并且在<form action="/users/register" method="POST" encType="multipart/form-data">

之后

答案 6 :(得分:0)

基本上,您这样做是正确的,但是如果您添加引导程序或任何其他库元素,它们已经有了验证器。 因此,您可以从 userSchema 中删除验证器。

在这里,在手机属性中,您可以删除“required: true”,因为它已经在引导程序和其他库/依赖项中进行了检查。

var userSchema = new Schema({
name: {
    type: String,
    required: 'Please enter your name',
    trim: true
},
phone: {
    type: number,
    required: true
} });

答案 7 :(得分:0)

我遇到了同样的错误,所以我所做的是我的模型中需要的任何字段我必须确保它出现在我的服务中的新用户对象中或您拥有的任何地方

const newUser = new User({
    nickname: Body.nickname,
    email: Body.email,
    password: Body.password,
    state: Body.state,
    gender:Body.gender,
    specialty:Body.specialty
});