我有一个其中安装了猫鼬的文件
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不是函数
我猜它是未定义的,因为它是在异步函数中声明的。
我将如何使其工作?
答案 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);
});