等待似乎不起作用,异步(nodejs)

Posted

技术标签:

【中文标题】等待似乎不起作用,异步(nodejs)【英文标题】:Await doesn't seem to work, Async (nodejs) 【发布时间】:2019-01-03 03:37:25 【问题描述】:

所以我正在尝试创建一个函数来检查用户是否存在于数据库中,如果不存在则将其导入数据库。我正在尝试使用 await 功能,以便在继续之前等待功能完成。

const doesUserExist = (id) => 
    MongoClient.connect(url, function(err, db) 
        if (err) throw err;
        var dbo = db.db('db');
        var users = dbo.collection('user');
        return new Promise(function(resolve, reject) 
            users.findOne('id': id, function (err, user) 
                if (err) throw err;
                console.log('User: ', user);
                if (user === null) 
                    resolve(false);
                 else 
                    resolve(true);
                
            );
        );
    );


const userLogin = async (user) =>  // User login function
    var id = String(user.id);

    // Check if the user exists

    var doesExist = await doesUserExist(id);
    console.log(doesExist);
    if(doesExist===undefined)
        console.log('ERROR: Exist is empty');
        return;
    
    if(doesExist===false)
        console.log(`User with the id $id does not exist.`);
        addUser(user);
     else 
        console.log(`User with the id $id does exist.`);
    

【问题讨论】:

【参考方案1】:

您没有从 doesUserExist 函数返回 Promise。

您只是在 MongoClient connect 函数的回调中返回一个 Promise。

你必须这样重构你的代码:

const doesUserExist = (steamid) => 
    return new Promise(function(resolve, reject) 
        MongoClient.connect(url, function(err, db) 
            if (err) throw err;
            var dbo = db.db('treehouse');
            var users = dbo.collection('users');
            users.findOne('steamid': steamid, function (err, user) 
                if (err) throw err;
                console.log('User: ', user);
                if (user === null) 
                    resolve(false);
                 else 
                    resolve(true);
                
            );
        );
    );

现在,doesUserExist 函数正在返回一个在 findOne 回调中解析的 Promise。

【讨论】:

以上是关于等待似乎不起作用,异步(nodejs)的主要内容,如果未能解决你的问题,请参考以下文章

打字稿异步/等待不起作用

调用函数时异步等待不起作用

dottrace 异步等待支持不起作用

功能推送的异步/等待不起作用[重复]

forEach循环内的XMLHTTPRequest不起作用

在useEffect中创建一个异步函数,并在函数的while循环中使用await,似乎不起作用