我正在使用Expressjs和Neo4j DB在Node.js中的登录页面上工作。
我想用一个函数检查数据库中是否已经存在用户。 因此,我创建了一个名为Users的模型(MVC),并在其中声明了一个Class,并且方法是isUserAlreadyExist。
我的问题是我要从此方法返回一个诺言以在控制器上处理它,但随后的关闭不起作用,我必须在网页上重新发送表格才能处理结果。
这是我的控制器代码:
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);
})
}
答案 0 :(得分:0)
我找到了解决方案。问题在于我处理表单(postRegister)的函数不是异步函数,并且该函数没有等待处理。
这是我的控制器的新代码:
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');
}
感谢所有帮助我的人!