首页 > 解决方案 > 如果表单没有发送两次,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);
    })
}

标签: node.jsexpressasynchronouspostpromise

解决方案


我找到了解决办法。问题是我处理表单(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');
}

感谢所有帮助过我的人!


推荐阅读