导出在异步函数内部声明的函数

时间:2018-09-01 10:13:25

标签: node.js asynchronous

我有一个其中安装了猫鼬的文件

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 :(得分:1)

由于该函数是异步创建的,因此一个选项是导出解析为Promise函数的fetchVideo。由于mongoose.connection.once是基于回调的,因此您必须将其转换为Promise

如果您希望fetchVideo解决某件事(而不是什么也没有解决),则还必须正确地将findOne调用与promise链链接在一起;要解决此问题,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);
});