#javascript #node.js #mongodb #typescript #mongoose
#javascript #node.js #mongodb #typescript #mongoose
Вопрос:
Я решил попробовать typescript и создать небольшой API аутентификации с помощью express. Что я хотел сделать сейчас, так это сделать username
и email
уникальным, поэтому моя схема mongoose выглядит следующим образом:
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"
}
}
в качестве ответа и со второй попытки я получу то же самое, но для электронной почты.
Возможно ли получить оба одновременно? Должен ли я вообще использовать mongoose для проверки моих данных? Я вижу, что многие люди рекомендуют joi, однако я подумал, что если mongoose уже способен на это, зачем использовать для этого дополнительную библиотеку.
Комментарии:
1. этот вызов validateSync мне не нравится
2. mongoosejs.com/docs/… похоже, вы получаете ошибку первого дубликата ключа из-за вашего индекса mongo. стоит попробовать написать свой собственный валидатор
3. Почему? Это для вызова валидаторов mongoose (которые, к сожалению, не включают дубликаты , отсюда и дополнительная функция с ошибкой)
4. Честно говоря, это всего лишь предположение. Как будет работать проверка вашей базы данных без ввода-вывода? Учитывая выбор между синхронным вызовом и асинхронным, я бы выбрал асинхронный. но, возможно, я ошибаюсь в этом контексте