Экспорт функции, объявленной внутри асинхронной функции - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть файл, в котором настроен mongoose

const keys = require('../chat/config/keys');
const mongoose = require('mongoose');
const dbURI = keys.mongoURI;
mongoose.connect(dbURI, { useNewUrlParser: true });
mongoose.set('debug', true);

let fetchVideo;

mongoose.connection.once('open', function () {
  console.log('Mongoose default connection open to ' + dbURI);

  let connectToDB = mongoose.connection.db;
  let videoChatDB = connectToDB.collection('videochat');

  fetchVideo = ({ id }) => {
    if (id !== '100') {
      videoChatDB.findOne({'studentID': parseInt(id)}).then((user) => {
        if (user) {
          console.log(user);
          return true;
        } else {
          console.log(user);
          return false;
        }
      });
    }
  }
});


module.exports = { fetchVideo };

И мне нужен этот файл внутри моего index.js файла, например, так:

let db = require('./db');

В моем индексном файле у меня есть соединение с сокетом, и мне нужно проверить базу данных, когда приходит новый пользователь.

socket.on('new-user', async (user) => {
  let checkAvail = await db.fetchVideo(user);
});

Но я получаю эту ошибку:

TypeError: db.fetchVideo не является функцией

Я предполагаю, что он не определен, так как он объявлен внутри асинхронной функции.

Как мне заставить это работать?

1 Ответ

0 голосов
/ 01 сентября 2018

Поскольку функция создается асинхронно, одним из вариантов является экспорт Promise, который преобразуется в функцию fetchVideo. Поскольку mongoose.connection.once основан на обратном вызове, вам придется преобразовать его в Promise.

Если вы хотите, чтобы fetchVideo разрешил что-то (а не что-нибудь), вы также должны правильно связать вызов findOne с цепочкой обещаний; чтобы исправить это, return videoChatDB.findOne....

const fetchVideoProm = new Promise((res, rej) => {
  mongoose.connection.once('open', function () {
    console.log('Mongoose default connection open to ' + dbURI);

    let connectToDB = mongoose.connection.db;
    let videoChatDB = connectToDB.collection('videochat');

    const fetchVideo = ({ id }) => {
      if (id !== '100') {
        return videoChatDB.findOne({'studentID': parseInt(id)}).then((user) => {
          if (user) {
            console.log(user);
            return true;
          } else {
            console.log(user);
            return false;
          }
        });
      }
    }
    res(fetchVideo);
  });
});


module.exports = { fetchVideoProm };

Используйте его, await создавая функцию fetchVideo, а затем вызвав ее:

socket.on('new-user', async (user) => {
  const fetchVideo = await db.fetchVideoProm;
  const checkAvail = await fetchVideo(user);
});
...