Ожидание завершения асинхронного "findOne" перед возвратом значения - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть файл extrafunctions.js, который экспортирует функции для запуска app.js.Одна из этих функций включает запрос MongODB findOne.Проблема в том, что функция возвращает значение до завершения запроса, и поэтому app.js не получает необходимые данные, а вместо этого «undefined».

Я в некоторой степени пробовал Promises, но не смогчтобы заставить что-либо работать.

app.js:

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

extraFunctions.js:

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) на res(JSON.stringify(result))

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Если вы используете собственный разъем 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);
  }
});
0 голосов
/ 07 апреля 2019

вам нужно использовать promise или async-await, ниже приведен пример реализации обещания:

App 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;
...