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