Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
Node.js Mongoose保存:文档验证失败,但接受console.log和手动插入_Node.js_Mongodb_Mongoose_Mern - Fatal编程技术网

Node.js Mongoose保存:文档验证失败,但接受console.log和手动插入

Node.js Mongoose保存:文档验证失败,但接受console.log和手动插入,node.js,mongodb,mongoose,mern,Node.js,Mongodb,Mongoose,Mern,我正在编写一些注册代码(MERN堆栈),在使用user.save时,我从MongoDB获得了“Document failed validation”。但是,如果我使用console.log(),将结果复制/粘贴到insert中,并用双引号替换单引号,则可以接受 以下是我目前的注册路线: router.post("/signup", async (req, res) => { let { firstName, lastName,

我正在编写一些注册代码(MERN堆栈),在使用user.save时,我从MongoDB获得了“Document failed validation”。但是,如果我使用console.log(),将结果复制/粘贴到insert中,并用双引号替换单引号,则可以接受

以下是我目前的注册路线:

router.post("/signup", async (req, res) => {
        let { firstName,
            lastName,
            profileImage,
            email,
            subscribed_Comments,
            subscribed_NewPost,
            username,
            password } = req.body;

        if (username && email && password && firstName && lastName && subscribed_Comments !== undefined && subscribed_NewPost !== undefined) {
            username = username.toLowerCase();
            email = email.toLowerCase();
            //Validate Password
            if (/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,15}$/.test(password)) {
                //Check if username or email already used
                User.findOne({ "$or": [{ "username": username }, { "email": email }] })
                    .exec((err, user) => {
                        if (err) {
                            console.error(err);
                            res.status(500).send({ "error": "An unexpected error occurred. Please contact an administrator." });
                        } else if (user === null) {
                            //User did not exist ... create
                            bcrypt.genSalt(Number(SALT), function (err, salt) {
                                if (err) {
                                    console.error(err);
                                    res.status(500).send({ "error": "An unexpected error occurred. Please contact an administrator." });
                                }
                                bcrypt.hash(password, salt, function (err, hash) {
                                    if (err) {
                                        console.error(err);
                                        res.status(500).send({ "error": "An unexpected error occurred. Please contact an administrator." });
                                    }
                                    //create user
                                    let user = new User({
                                        username: username,
                                        email: email,
                                        password: hash,
                                        userRole: "User"
                                    });
                                    console.log(user)
                                    user.save((err, user) => {
                                        if (err) {
                                            console.error(err);
                                            res.status(500).send({ "error": "Failed to create a User. Please contact an administrator." });
                                        } else {
                                            console.log(`Successfully created user ${user.username}`);
                                            //create account
                                            let account = new Account({
                                                "FirstName": firstName,
                                                "LastName": lastName,
                                                "SubscribedNewPost": subscribed_NewPost,
                                                "SubscribedComments": subscribed_Comments,
                                                "ProfileImage": profileImage || "",
                                                "User_Account": user._id
                                            });
                                            account.save((err, account) => {
                                                if (err) {
                                                    console.error(err);
                                                    user.delete();
                                                    res.status(500).send({ "error": "Failed to create an Account. Please contact an Administrator" });
                                                } else {
                                                    console.log(`Successfully created account for ${account.firstName} ${account.lastName}`);
                                                    req.session.userid = user._id;
                                                    req.session.username = user.username;
                                                    req.session.userRole = user.userRole;
                                                }
                                            })
                                        }
                                    });
                                });
                            });
                        } else {
                            console.log(`Username: ${username} or Email: ${email} already in use.`);
                            res.status(500).send({ "error": "Username or Email is already in use" });
                        }
                    });
            } else {
                // Invalid Password
                console.log("Invalid Password in Signup");
                res.status(500).send({ "error": "Password did not meet expected criteria" });
            }
        } else {
            res.status(500).send({ "error": "Invalid Request" });
        }
    })
这是猫鼬模式

const mongoose = require("mongoose");

const userSchema = mongoose.Schema({
  username: {
    type: String,
    unique: [true, "That username already registered."],
    required: [true, "Username is required."]
  },
  email: {
    type: String,
    unique: [true, "That email is already registered."],
    required: [true, "Email is required."],
    validate: {
        validator: function(v){
            return /^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/i.test(v);
        },
        message: "Email was not in a valid format."
    }    
  },
  password: {
    type: String,
    required: [true, "Password is required."]
  },
  userRole: {
      type: String,
      enum: ["Anonymous", "User", "Moderator"],
      required: [true, "User Role is required."]
  }
}, {collection: "User"}, {versionKey: false})

module.exports = mongoose.model("User",userSchema);
这是MongoDB验证

{
  $jsonSchema: {
    bsonType: 'object',
    title: 'user',
    required: [
      'username',
      'email',
      'password',
      'userRole'
    ],
    properties: {
      _id: {
        bsonType: 'objectId',
        uniqueItems: true
      },
      username: {
        bsonType: 'string',
        uniqueItems: true
      },
      email: {
        bsonType: 'string',
        uniqueItems: true,
        pattern: '^\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}$'
      },
      password: {
        bsonType: 'string'
      },
      userRole: {
        'enum': [
          'Anonymous',
          'User',
          'Moderator'
        ]
      }
    },
    additionalProperties: false
  }
}
以下是验证失败的json(来自console.log())。如果我复制/粘贴它并用双引号替换单引号,那么mongodb会接受它

{
  _id: 606a0a09d70db426acda05ee,
  username: 'johndoe',
  email: 'johndoe@gmail.com',
  password: '$2b$10$vofYCj31690seAIKHqjkUuba8paeJy5ZC1Qt8ZHjZHmKVQurZ.hfi',       
  userRole: 'User'
}
有没有想过为什么上面的代码在遵循我定义的模式时验证失败?我已经尝试从Mongoose模式中删除验证,以确保它没有失败,也没有失败。我认为唯一剩下的可能是它没有设置_id的格式,但是mongodb拒绝mongoose创建的默认_id是没有意义的

编辑:这是堆栈跟踪

MongoError: Document failed validation
    at Function.create (D:\Projects\portfolio-backend\node_modules\mongodb\lib\core\error.js:57:12)
    at toError (D:\Projects\portfolio-backend\node_modules\mongodb\lib\utils.js:123:22)
    at D:\Projects\portfolio-backend\node_modules\mongodb\lib\operations\common_functions.js:265:39
    at handler (D:\Projects\portfolio-backend\node_modules\mongodb\lib\core\sdam\topology.js:942:24)
    at D:\Projects\portfolio-backend\node_modules\mongodb\lib\cmap\connection_pool.js:350:13
    at handleOperationResult (D:\Projects\portfolio-backend\node_modules\mongodb\lib\core\sdam\server.js:558:5)
    at MessageStream.messageHandler (D:\Projects\portfolio-backend\node_modules\mongodb\lib\cmap\connection.js:277:5)
    at MessageStream.emit (events.js:310:20)
    at processIncomingData (D:\Projects\portfolio-backend\node_modules\mongodb\lib\cmap\message_stream.js:144:12)
    at MessageStream._write (D:\Projects\portfolio-backend\node_modules\mongodb\lib\cmap\message_stream.js:42:5)
    at doWrite (_stream_writable.js:442:12)
    at writeOrBuffer (_stream_writable.js:426:5)
    at MessageStream.Writable.write (_stream_writable.js:317:11)
    at Socket.ondata (_stream_readable.js:695:22)
    at Socket.emit (events.js:310:20)
    at addChunk (_stream_readable.js:286:12) {
  driver: true,
  name: 'MongoError',
  index: 0,
  code: 121
}

该错误可能是由于
\u id
造成的。您正在发送
ObjectId
的字符串表示,但是
\u id
所需的类型是
ObjectId
。尝试将
_id:606A09D70DB426ACDA05EE
替换为
_id:ObjectId('606a0a09d70db426acda05ee')

您还可以尝试更改此设置:

let user = new User({
  username: username,
  email: email,
  password: hash,
});
console.log(user)
user.save((err, user) => {
为此:

User.create({
  username: username,
  email: email,
  password: hash,
}).then((user)=>{
   console.log('User successfully created: ', user);
}, (error)=>{
   console.log('ERROR: ', error);
})

所以,我明白了。显然,Mongoose模式将_v整数添加到.save调用中,尽管模式中有versionKey:false。我通过将验证设置为警告而不是错误来测试它,并观察到保存的文档中出现的_v。为了修复它,我在mongo中的验证JSON中添加了以下内容

  __v: {
    bsonType: 'int'
  }

TLDR:缺少的“验证”是未定义的_v属性,而“additionalProperties”设置为false。

你能在这里复制验证错误吗?是的,我的坏哈哈。我编辑了这篇文章