【问题标题】:Sequelize error handling & code optimizationSequelize 错误处理和代码优化
【发布时间】:2019-12-28 14:23:40
【问题描述】:

我的用例相当简单,我想创建一个新用户(用户名、电子邮件、密码),但首先检查用户名/电子邮件是否不存在。
检查后,我使用 bcrypt 对密码进行哈希处理并在我的数据库中创建/存储用户

这是我实际使用的代码,它可以工作,但我认为它有点太复杂了,所以我想知道是否有什么我可以做的让它更具可读性/优化

    ipcMain.on('register', (e, newUser) => {
    userRepo.findByUsername(newUser.username).then(
        (user) => {
            if (user)
                e.sender.send('register-failed', "Username already exists!");
            else {
                userRepo.findByEmail(newUser.email).then(
                    (user) => {
                        if (user)
                            e.sender.send('register-failed', "Email already exists!");
                        else {
                            bcrypt.hash(newUser.password, saltRounds).then(
                                (hasedPassword) => {
                                    newUser.password = hasedPassword;
                                    userRepo.create(newUser).then(
                                        (user) => {
                                            e.sender.send('register-success', user.get({plain:true}));
                                        },
                                        (error) => {
                                            e.sender.send('register-failed', "Unexpected Error");
                                        }
                                    )
                                }
                            )
                        }
                    }
                )
            }
        },
        (error) => { e.sender.send('register-failed', "Unexpected Error"); }
    ).catch(error => e.sender.send('register-failed', "Unexpected Error"));
});

userRepo 模块:

const db = require('../db.js');

const findByUsername = function (username) {
    return db.models.User.findOne({
        where: {
            username: username
        }
    });
}

const findByEmail = function (email) {
    return db.models.User.findOne({
        where: {
            email: email
        }
    });
}

const create = function (newUser) {
    return db.models.User.create({
        username: newUser.username,
        email: newUser.email,
        password: newUser.password
    });
}

module.exports = { findByUsername, findByEmail, create }

感谢您的帮助。

编辑: 这是一个可读性更高的代码(可能会进行更多优化,但我觉得它足够可读)

ipcMain.on('register', (e, newUser) => {
Promise.all([userRepo.isUsernameAvailable(newUser.username), userRepo.isEmailAvailable(newUser.email)])
    .then(creation => {
        bcrypt.hash(newUser.password, saltRounds).then(
            (hashedPassword) => {
                newUser.password = hashedPassword;
                userRepo.create(newUser).then(
                    (user) => {
                        e.sender.send('register-success', user.get({ plain: true }));
                    }
                ).catch(error => e.sender.send('register-failed', "Unexpected internal error!"))
            }
        ).catch(error => e.sender.send('register-failed', "Unexpected internal error!"));

    }) // User already exists
    .catch((exists) => e.sender.send('register-failed', exists))

})

使用这两个函数检查用户名和电子邮件的可用性

async function isUsernameAvailable(username){
    const user = await findByUsername(username);
    if(!user) 
        return Promise.resolve(`Username : "${username}" is available`)
    return Promise.reject(`Username : "${username}" is already taken !`)
}

async function isEmailAvailable(email){
    const user = await findByEmail(email);
    if(!user) 
        return Promise.resolve(`Email : "${email}" is available`)
    return Promise.reject(`Email : "${email}" is already taken !`)
}

【问题讨论】:

    标签: sqlite orm sequelize.js


    【解决方案1】:

    您首先检查用户名是否存在,然后检查电子邮件是否存在。但是,它们都可以使用Promise.all 异步检查。

    如果任何用户名或电子邮件已经存在,那么您可以返回错误消息。

    您使用了一个 Promise 链,但是如果您使用 async-await 实现相同的代码,代码看起来会更加简洁易读。

    请参考以下博客了解如何使用 async-await 实现 Promise.all

    https://www.taniarascia.com/promise-all-with-async-await/

    【讨论】:

    • 感谢您的提示,我设法通过使用 promise.all() 使我的代码更清晰。编辑了我的第一篇文章
    • 很高兴听到这个消息!
    猜你喜欢
    • 2016-01-08
    • 2022-11-23
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 2023-03-19
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多