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 错误处理和代码优化的主要内容,如果未能解决你的问题,请参考以下文章
Sequelize findOrCreate() -- .catch() 块在没有错误期间在 spread() 之后执行
脚本 php artisan 优化处理使用 laravel 5.4 返回的 post-update-cmd 事件,错误代码为 1