Javascript Mongoose:需要验证错误路径
我试图用mongoose在mongodb中保存一个新文档,但我得到了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
验证错误:需要路径“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
});