等待异步“ findOne”完成,然后返回值

时间:2019-04-07 17:05:32

标签: javascript node.js mongodb asynchronous

我有一个名为extrafunctions.js的文件,该文件导出要由app.js运行的函数。这些功能之一包括MongoDB查询findOne。问题在于该函数在查询完成之前返回一个值,因此app.js不会获取所需的数据,而是“未定义”。

我在某种程度上尝试了Promises,但没有任何东西可以工作。

app.js:

[ 5b579074dc1eac0014276442, 5b574e03dc1eac0014276418 ]

extraFunctions.js:

const extraFunctions = require("./extraFunctions");
app.get('/api/login', (req, res) => {
    res.end(extraFunctions.login());
});

固定版本 与接受的评论相同,但必须将function login () { client.connect(err => { var collection = client.db("site").collection("test"); collection.findOne({}, (err, result) => { if (err) throw err; console.log(result); return result; }); client.close(); }); } module.exports.login = login; 更改为res(result)

2 个答案:

答案 0 :(得分:0)

您需要使用promiseasync-await,以下是Promise实现的示例:

应用js

const extraFunctions = require("./extraFunctions");
app.get('/api/login', (req, res) => {
    extraFunctions.login().then(result =>{
        res.end(result);
    })
});

extraFunctions.js

function login() {
    return new Promise((res, rej) => {
        client.connect(err => {
            if(err){
                rej(err)
            }
            var collection = client.db("site").collection("test");
            collection.findOne({}, (err, result) => {
                if (err) rej(err);
                console.log(result);
                res(result)
            });
            client.close();
        });
    })
}

module.exports.login = login;

答案 1 :(得分:0)

如果您使用本机mongodb连接器,则它提供Promise支持。您可以这样使用:

// connection is a promise
const connection = MongoClient.connect(url, { useNewUrlParser: true });

// async function
async function login () {
  let result;
  try {
    const client = await connection;
    var collection = client.db("site").collection("test");
    try {
      result = await collection.findOne({})
    } catch (err) {
      throw err;
    }
    client.close();
  } catch (e) {
    throw e;
  }
  return result;
}

module.exports.login = login;

在您的路线上:

const extraFunctions = require("./extraFunctions");
app.get('/api/login', async (req, res, next) => {
  try {
    const result = await extraFunctions.login();
    res.end(result);
  } catch (e) {
    next(e);
  }
});