我决定尝试打字稿,并使用express创建一个小型身份验证API。我现在想做的是,使username
和email
唯一,因此我的猫鼬模式如下所示:
import * as mongoose from 'mongoose';
const userSchema = new mongoose.Schema({
username: {
type: String,
required: [true, 'Username is required!'],
unique: true,
min: 6,
max: 255,
},
email: {
type: String,
required: [true, 'Email is required!'],
unique: true,
min: 6,
max: 255,
},
password: {
type: String,
required: [true, 'Password is required!'],
min: 6,
max: 1024,
},
date: {
type: Date,
default: Date.now(),
},
});
export const User = mongoose.model('User', userSchema);
我的控制器也很简单:
export async function registerUser(
req: express.Request,
res: express.Response,
): Promise<express.Response> {
const user = new User({
username: req.body.username,
email: req.body.email,
password: req.body.password,
});
const error = user.validateSync();
if (error) {
return res.status(400).json(error);
}
await user.save(function (err) {
if (err) {
return res.status(400).send(err);
}
return res.status(200).send({ success: true, message: 'User created!' });
});
}
这一切都按预期工作,但是,如果我发出POST请求,而数据库中已经存在电子邮件和用户名,那么我在正文中都不会得到响应。例如,如果我通过以下方式发出POST请求:
{
"username": "username2",
"email": "emailblabla2",
"password": "password1234"
}
在已经使用username2
和emailblabla2
的地方,我将首先得到:
{
"driver": true,
"name": "MongoError",
"index": 0,
"code": 11000,
"keyPattern": {
"username": 1
},
"keyValue": {
"username": "username2"
}
}
作为响应,第二次尝试时,除了电子邮件,我将得到相同的信息。
是否可以同时获得两者?我是否应该甚至使用猫鼬来验证我的数据?我看到很多人都推荐joi,但是,我想如果猫鼬已经可以做到这一点,为什么还要使用附加的库。