从express后端向vuejs前端发送消息



嗨,这对我来说有点复杂,希望任何人都能帮忙。情况如下:我有一个应用程序,服务器端有node/express,前端有Vuejs,我在后面做的是创建一个用户,这是代码:

const createUser=(req, res, next) => {
console.log("register");
let con=req.con
let { email,password } = req.body;
console.log(req.body)
con.query(
`SELECT * FROM users
WHERE email = $1`,
[email],
(err, results) => {
if (err) {
console.log(err);
res.status(404).json({error: err});
}
console.log(results);
if (results.rows.length > 0) {
//throw new error_types.InfoError("user already exists");
res.status(200).json({error: "user already exists"});
} else {
const hashedPassword = bcrypt.hashSync(password, parseInt(process.env.BCRYPT_ROUNDS));
con.query('INSERT INTO users (email,password) VALUES ($1, $2)',
[email,password],
(err, results) => {
if (err) {
next(err);

}
res.json({info: "User inseted" });
}
);
}
}
);
}

所以我正在检查它是否已经存在,或者在DB中注册它,在这里一切都很好。现在在我的Vuejs部分,我有这个:

REGISTER({ commit, dispatch, rootState }, { payload }) {

const {email,password} = payload
console.log(payload)
commit('SET_STATE', {
loading: true,
})
const register = mapAuthProviders[rootState.settings.authProvider].register
register(email,password)
.then(success => {
if (success) {
notification.success({
message: "Succesful Registered",
description: "You have successfully registered!",
})
router.push('/auth/login')
commit('SET_STATE', {
loading: false,
})
}
if (!success) {
commit('SET_STATE', {
loading: false,
})
}
})
},

现在问题发生在这里,因为注册已经完成了,但当我再次使用同一封电子邮件进行另一次注册时,它说同一条消息已成功注册,但没有保存到DB中。现在我想要的是出现的消息用户aleady存在。有人能帮我吗?编辑:添加axios部分

export async function register(email,password) {
return axios
.post('/register', {emailpassword,})
.then(response => {
if (response) {
const { token } = response.data
if (token) {
store.set('accessToken', token)
}
return response.data
}
return false
})
.catch(err => console.log(err))

}

如果没有看到从客户端执行HTTP请求的实际源代码,就很难说错误处理是什么样子的。最明显的罪魁祸首是:

res.status(200).json({error: "user already exists"});

当出现错误时,您的响应为HTTP 200 OK。通常,客户端实现会将此视为成功。你应该向客户端发出错误发生的信号——例如,用";409冲突";。还要确保客户端的fetch()调用(或客户端用于与服务器对话的任何调用(进行了正确的错误处理(检查statusCode(。

然而,该代码还有另一个问题——竞争条件。这是TOCTTOU(检查时间到使用时间(的情况,其中存在性检查(SELECT(和INSERT之间经过了非零时间。如果两个用户同时注册同一封电子邮件,他们可能都会成功。

您应该完全删除该检查,并使用数据库提供的唯一性约束(UNIQUE INDEX(。通过这种方式,DB保证不会有重复,并且您不必担心比赛条件。

最新更新