在我用express-generator
生成的express应用程序中,我想在其他一些控制器文件中使用socket.io
的io
来向客户端套接字发送数据。我的方法如下所示,但我得到了以下错误。如果有人能在这种情况下帮助我,那将是一个很大的帮助。
(node:11376)未处理承诺拒绝警告:类型错误:io.emit不是位于F:\backend\controllers\LessonController.js:169:9的函数
在express-generator
生成的express应用程序中,创建服务器的过程发生在/bin/www.js
中,我尝试从那里导入io
示例并在其他文件中使用它,但没有成功。
文件夹/www.js
#!/usr/bin/env node
var app = require('../app');
var debug = require('debug')('backend:server');
var http = require('http');
var port = normalizePort(process.env.PORT || '8080');
app.set('port', port);
var server = http.createServer(app);
const io = require('socket.io')(server);
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
// several other functions are omitted for brevity
module.exports = io;
课程控制器.js
const Lesson = require('../models/Lesson');
const Course = require('../models/Course');
const User = require('../models/User');
const io = require('../bin/www')
var _ = require('lodash');
module.exports = {
addComment: async (lessonId, userId, content, callback) => {
const newData = {
comments: {
user: userId,
content: content,
},
};
Lesson.findOneAndUpdate({ _id: lessonId }, { $push: newData }, {new: true})
.exec()
.then(
function (data) {
if (data) {
io.emit("comment_"+lessonId,data)
callback(null, data);
} else if (err) {
callback(err, null);
}
}
)
}
};
3条答案
按热度按时间nukf8bse1#
您可以尝试将
socket.io
示例导出到全局级别,并根据需要访问它。我的项目也是用express-generator创建的,因此,遵循相同的模板。
在我的项目中,我想计算当前主页中的活跃用户数。
下面是一个例子:
遵循此策略,您可以在应用程序的任何路由中使用
socketio
。vptzau2j2#
这里有一个解决方案
创建模块io.js
在bin/www.js
在您的控制器/ LessonController.js中
mtb9vblg3#
创建
socketInstance.js
在
socket.js
内部初始化io
现在,您可以在应用中的任何位置调用
getSocketInstance
。