sqlite - Sequelize 错误处理和代码优化

标签 sqlite orm sequelize.js

我的用例相当简单,我想创建一个新用户(用户名、电子邮件、密码),但首先检查用户名/电子邮件是否不存在。
检查后,我使用 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 !`)
}

最佳答案

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

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

你已经使用了一个 Promise 链,但是如果你使用 async-await 实现相同的代码,代码看起来会更加清晰易读。

如何实现 Promise.all 请引用以下博客使用异步等待。

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

关于sqlite - Sequelize 错误处理和代码优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59511736/

相关文章:

java - 使用 java 访问 SQLite 数据库

java - @SecondaryTable 注释不适用于不同架构中的相同表名

python - SQLAlchemy 和显式锁定

mysql - Sequelize - 表多元化错误,表中没有实例

node.js - 使用 Sequelize 和 Postgres 发送 POST 请求后,为什么我的外键列返回两次?

java - 使用 Java 桌面应用程序中的 API 更新 Dropbox(或 Drive)共享文件中的数据

sqlite - 在 SQLite 数据库中插入当前日期和时间

javascript - 从 sqlite 获取时无法在 javascript 函数中分配值

Hibernate如何实现动态数据结构

node.js - Sequelize 迁移 - 添加外键约束问题