Sequelize 错误处理和代码优化

Posted

技术标签:

【中文标题】Sequelize 错误处理和代码优化【英文标题】:Sequelize error handling & code optimization 【发布时间】: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 !`)

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

感谢您的提示,我设法通过使用 promise.all() 使我的代码更清晰。编辑了我的第一篇文章 很高兴听到这个消息!

以上是关于Sequelize 错误处理和代码优化的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA入门: 代码调试/错误处理/代码优化

Sequelize findOrCreate() -- .catch() 块在没有错误期间在 spread() 之后执行

脚本 php artisan 优化处理使用 laravel 5.4 返回的 post-update-cmd 事件,错误代码为 1

Sequelize hasMany工作正常,但反比关系不正常

错误处理代码性能 [重复]

在 Express.js 中停止执行 Sequelize 承诺