node.js - 如果表单没有发送两次,Promise 不想进入
问题描述
我正在使用 Expressjs 和 Neo4j 数据库在 Nodejs 中的登录页面上工作。
如果用户已存在于我的数据库中,我想检查一个函数。所以我创建了一个名为Users的模型(MVC),我在里面声明了一个类,还有一个方法是isUserAlreadyExist。
我的问题是我从这个方法返回一个承诺来在我的控制器上处理它,但是 then 关闭不起作用我必须在网页上重新发送表单以处理结果。
这是我的控制器代码:
exports.postRegister = (req, res, next) => { //async
if(req.method == "POST")
{
const login = req.body.login;
const passwd = req.body.passwd;
console.log('login = '+login +' passwd = '+passwd);
if(login == null || passwd == null)
{
return res.status(400).send('Error: Params missings');
}
else {
const new_user = new User(login, passwd);
new_user.isUserAlreadyExist().then((result) =>{
console.log(result)
}).catch((err) =>{
console.err(err);
})
}
}
}
这是我的模型用户的一部分
async isUserAlreadyExist()
{
const session = db.session();
const params = this.login;
const cypher = "MATCH (a:User) WHERE a.login = {login} RETURN a";
const params = {login : login};
return new Promise((resolve, reject) => {
session.run(cypher, params).then(result => {
session.close()
resolve(result.records.length);
}).catch(err =>{
session.close()
})
});
}
正如@robertklep 和@solooo7 建议的那样,我做了这个改变,但情况是一样的
isUserAlreadyExist()
{
const session = db.session();
const login = this.login;
const cypher = "MATCH (a:User) WHERE a.login = {login} RETURN a";
const params = {login : login};
return (session.run(cypher, params)
.then(result => {
session.close();
return result.records.length;
})
.catch(err =>{
session.close();
return (-1);
})
}
解决方案
我找到了解决办法。问题是我处理表单(postRegister)的函数不是异步的,并且该函数没有等待mothing。
这是我的控制器的新代码:
exports.postRegister = async (req, res, next) => { //async
const login = req.body.login;
const passwd = req.body.passwd;
console.log('login = '+login +' passwd = '+passwd);
if(login == null || passwd == null)
{
return res.status(400).send('Error: Params missings');
}
else {
const new_user = new User(login, passwd);
await new_user.isUserAlreadyExist().then((result) =>{
console.log(result)
res.redirect('/');
}).catch((err) =>{
console.err(err);
res.redirect('/');
})
}
console.log('end');
}
感谢所有帮助过我的人!
推荐阅读
- python - 在 Tkinter 中下载文件时权限被拒绝
- r - 将工作表名称作为变量添加到我的数据框
- .net - .NET MVC 应用程序的 Office365 身份验证
- java - 将 Guava Sets 转换为 List 的最快方法
- angular - 如何以角度在数组中记录同一日期
- javascript - Hot Module Replacement 不会在更新 html 内容时重新加载,而是在 webpack 5 上的 css 和 js 上重新加载
- php - 在控制器中,我使用了输入标签,它将检查是否为“0”,然后未选中,否则检查。我有逃避问题
- python - 使用 np.where 函数 Numpy Python 通过数组添加
- sql - 根据 SQL 中查询的值添加指示“1”或“0”的列
- python - Python 从字符串中去除 \n 制表符