Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose:需要验证错误路径_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongoose:需要验证错误路径

Javascript Mongoose:需要验证错误路径,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图用mongoose在mongodb中保存一个新文档,但我得到了验证错误:需要路径“email”,需要路径“passwordHash”,需要路径“username”。即使我提供了email、passwordHash和username 这是用户模式 var userSchema = new schema({ _id: Number, username: { type: String, required: true, unique: true }, p

我试图用mongoose在mongodb中保存一个新文档,但我得到了
验证错误:需要路径“email”,需要路径“passwordHash”,需要路径“username”。
即使我提供了email、passwordHash和username

这是用户模式

    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
作为临时值吗?

作为对您上次评论的回应

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

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 });

好的,下面的方法是我如何消除错误的。我有以下模式:

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,
});
我的终端抛出以下日志,然后在调用我的寄存器函数时进入无限重载:

(节点:6676)未处理的PromiserEjectionWarning:未处理的承诺 拒绝(拒绝id:1):验证错误:密码:路径
密码是必需的,电子邮件:无效电子邮件

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


因此,正如它所说的路径“密码”是必需的,我在我的模型中注释了
required:true
行,并在我的模型中注释了
validate:email
行。

我在寻找相同问题的解决方案时遇到了这篇文章——验证错误,即使值被传递到了正文中。 结果发现我错过了那辆车

const bodyParser = require("body-parser")

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

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

解决此类错误

ValidationError: Path 'email' is required.
您的电子邮件在架构中设置为必填,但未给出任何值或未在模型中添加电子邮件字段

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


我认为这将解决此类问题。

对我来说,快速而肮脏的解决方法是从我的输入表单字段中删除
encType=“multipart/form data”

之前,


而且,在

之后,我也遇到了同样的错误

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;
下面是我的终端中的错误:

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


我所做的只是从用户中删除required,一切正常。

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

在这里,在phone属性中,您可以删除“required:true”,因为它已经在引导和其他库/依赖项中被选中

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

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

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

我看不出你在哪里设置新用户的电子邮件、密码哈希和用户名。您正在将它们设置为null,然后尝试保存它。您不能这样做吗
null
是一个值。这不是解决方案,如果这是一个必需的嵌套字段,它应该保持这样。
const newUser = new User({
    nickname: Body.nickname,
    email: Body.email,
    password: Body.password,
    state: Body.state,
    gender:Body.gender,
    specialty:Body.specialty
});