mongo自动创建键/值为null的索引



当我在这条路由上创建一个新用户(With mongoose)时,它被创建。我可以在控制台中看到验证,也可以在mongo数据库中看到用户。但是当我尝试创建第二个用户(使用不同的用户名)时,我得到这个错误:

(node:16480) UnhandledPromiseRejectionWarning: MongoError: E11000 duplicate key error collection: .users index: userName_1 dup key: {userName: null}

  1. 索引userName_1来自?
  2. userName来自?
  3. 为什么这个值为null?
  4. 我如何摆脱它?
router.post('/register', (req, res) => {
User.findOne({username: req.body.username}, async (err, user) => {
if (err) throw err
if (user) res.json('User already exists')
if (!user) {
const hashPassword = await bcrtypt.hash(req.body.password, 10)
const newUser = new User({
username: req.body.username,
password: hashPassword,
})
await newUser.save()
res.json('User created!')
console.log(newUser)
}
})
})

这是Schema:

const userSchema = new Schema({
username: {
type: String,
required: true,
unique: true,
lowercase: true,
},
password: {
type: String,
required: true,
}
}, {
timestamps: true,
})

从你的模式:

username: {
type: String,
required: true,
unique: true,
lowercase: true,
}

Mongoose将自动创建索引来强制执行unique。这是正确的,因为它不需要在插入之前进行查找来强制执行它,所以它更快。

仔细检查username字段是否按照您在数据库中的期望被实际保存。required: true应该拾取,但错误消息显示,您不知何故有一个null用户名。

同样-因为您使用lowercase,您的findOne可能不适合确定用户是否已经存在。例如,如果我创建了一个用户"adam",然后尝试创建一个用户"adam",这将导致一个错误,因为查找"adam"将一无所获,但是模式会将值小写以保存它"adam",索引将失败。

最新更新