Как проверить, что электронное письмо уже занято в MongoDB - PullRequest
0 голосов
/ 08 января 2020

Я создаю API в NodeJS и MongoDB. API в целом просто управляет студентами и проектами. Мне нужно добавить новый маршрут, чтобы проверить, было ли уже занято письмо в БД. В качестве параметра мне нужно передать письмо от тела как req.body.email, а затем проверить, доступно ли оно. Я пробовал 2 способа, но у меня ничего не получалось и не знаю, как это исправить.

Маршрут, который я сделал первым:

router.get("/check-email", async (req, res) => {
    await Student.emailCheck(req.body.email, (error, student) => {
        if (error) {
            return next(error);
        }

        if (student) {
            res.status(401).json({ error: "Email already used" });
        } else {
            res.json({ message: "Email is available" });
        }
    });
});

и модель:

const mongoose = require("../utilities/dbConnect");
require("mongoose-type-email");

const schema = {
    name: {
        type: String,
        required: true
    },
    surname: {
        type: String,
        required: true
    },
    email: {
        type: mongoose.SchemaTypes.Email,
        required: true,
        unique: true
    },
    dateOfBirth: {
        type: String,
        required: true
    }
};

const collectionName = "student";
const studentSchema = mongoose.Schema(schema);
const Student = mongoose.model(collectionName, studentSchema);

const emailCheck = (email, cb) => {
    Student.findOne({ email: email }).exec((error, student) => {
        if (error) {
            return cb(error);
        }
        cb(null, student);
    });
};

module.exports = { Student, emailCheck };

Маршрут метода 2:

await validateEmailAccessibility(req.body.email).then(
           valid => {
            if (valid) {
                res.send("Email is valid");
              } else {
                res.send("Email already used");
              }
           }
       );

и использование утилита

let Student = require("../models/student.model");

const validateEmailAccessibility = async email => {
    const result = await Student.findOne({ email: email });
    return result !== null;
};

module.exports = validateEmailAccessibility;

Я хотел бы понять, как лучше всего достичь своей цели и что я делаю неправильно в моих отношениях.

1 Ответ

1 голос
/ 08 января 2020

Проблема связана с типом данных.

В определении схемы в поле email указано typeof mongoose.SchemaTypes.Email. Но при поиске внутри Mon go вы передаете String type.

EDIT:

Рабочий код (используется app вместо Route):

app.post("/check-email", function (req, res) {
    Student.findOne({ email: req.body.email }, (error, result) => {

        if (result) {
            res.status(401).json({ error: "Email already used" });
        } else {
            res.json({ message: "Email is available" });
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...