Как сделать возвращаемые значения findOrCreate доступными для маршрутизатора

#javascript #node.js #express #sequelize.js

#javascript #node.js #выразить #sequelize.js

Вопрос:

Итак, в моем экспресс-приложении у меня есть отдельный файл database.js , который содержит все модели и функции для вставки, удаления, обновления и т.д. У меня также есть отдельный контроллер для каждой модели.

database.js

 module.exports = {
    createUser: function (username, email, password) {
        return sequelize.sync().then(function () {
            User.findOrCreate({
                where: {
                    username: name,
                    email: email
                },
                defaults: {
                    username: username,
                    password: password,
                    email: email
                }
            }).then(([user, created]) => {
                console.log(user.get({plain:true}));
                console.log(created)
                });
            });
        }
    };
 

controllers/user.js

 const database = require("../database.js");
module.exports = {
    register: function (req, res) {
        database.createUser(req.body.username, req.body.email, req.body.password);
        res.json({...
        })

    }
};
 

Итак, в основном я хочу получить объект user и логическое значение, которое сообщает мне, был ли он создан для маршрутизатора, чтобы я мог проверить, был ли создан пользователь, и дать соответствующий ответ.

Комментарии:

1. Зачем ты вообще звонишь sequalize.sync() createUser ? Это неправильно. Вы вообще не должны вызывать его в приложении. Вы можете непреднамеренно испортить свою базу данных (если вы поставите где force: true -нибудь флаг, то вы обречены), не говоря уже о накладных расходах на синхронизацию. Они sequalize.sync() должны выполняться только во время миграции.

2. Также обещания могут связывать возвращаемое значение: ваш окончательный .then createUser ввод может просто return [user, created]; сделать его доступным в user.js via .then() .

Ответ №1:

Вы можете удалить then в CreateUser и разрешить обещание при вызове функции:

 module.exports = {
    createUser: function (username, email, password) {
        return User.findOrCreate({
                where: {
                    username: name,
                    email: email
                },
                defaults: {
                    username: username,
                    password: password,
                    email: email
                }
            })
    };
 

Затем обещание преобразуется в массив с объектом user и логическим значением, которое вы ищете

 const database = require("../database.js");
module.exports = {
    register: function (req, res) {
        database.createUser(req.body.username, req.body.email, req.body.password)
            .then((result) => {
                const [ object, created ] = resu<
                res.json({ user_is_created: created })
            })
    }
};
 

Это не полное решение, возможно, вам придется изучить крайние случаи и ошибки, но в основном так вы бы это сделали.