express - UnhandledPromiseRejectionWarning: TypeError: io.emit is not a function
问题描述
我正在使用 Socket.io 进行实时图像上传过程,但我收到了下面提到的这个错误。我通过引用这个答案在不同的文件中编写套接字和 app.js 逻辑现在我想在控制器文件中发出该套接字事件但得到了错误
UnhandledPromiseRejectionWarning: TypeError: io.emit is not a function
下面是我的代码
app.js
// modules =================================================
var express = require('express');
var app = express();
const logger = require('morgan');
var bodyParser = require('body-parser');
const indexRouter = require("./routes/index");
const cors = require('cors');
const path = require("path");
const config = require("./environments/index");
var http = require('http').Server(app);
var sockets = require('./apis/socket.io');
// configuration ===========================================
var port = config.PORT || 8081; // set our port
sockets.getSocketIo(http);
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({
limit: '50mb',
extended: true,
parameterLimit: 50000
}));
app.use(cors());
app.use(logger('dev'))
app.use("/api", indexRouter);
app.use(express.static(path.join(__dirname, "/build")));
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
http.listen(port, () => {
console.log('Magic happens on port ' + port); // shoutout to the user
});
exports = module.exports = app;
这是socket.io.js
文件代码
var socketio = require('socket.io');
var io = {};
module.exports = {
getSocketIo: function (app) {
let userId = 1
io = socketio.listen(app);
io.sockets.on('connection', function (socket) {
console.log("new connection: " + socket.id);
console.log(socket)
console.log('socket connected')
// let rooms = socket.id
io.sockets.adapter.rooms
if (io.nsps['/'].adapter.rooms["room-" + userId] && io.nsps['/'].adapter.rooms["room-" +
userId].length > 0) userId++;
socket.join("room-" + userId);
//Send this event to everyone in the room.
io.sockets.in("room-" + userId).emit('connectToRoom', "You are in room no. " + userId);
io.sockets.in(userId).emit('Image_upload', "Image uploading is started");
console.log(socket.room)
console.log(socket)
});
}
};
这是 api 控制器的控制器代码
report_data: async (req, res) => {
if (!req.body.id) {
logger.warn(error.MANDATORY_FIELDS);
return res.status(500).send(error.MANDATORY_FIELDS)
}
io.emit('progress', "Image is Uploading started Please Wait A minute");
io.emit('error', "clients connected!");
let Id = req.body.id;
let path = `tmp/daily_gasoline_report/${Id}`;
req.body.data_url = path
sequelize.sequelize.transaction(async (t1) => {
let result = error.OK
result.data = data
logger.info(result);
return res.status(200).send(result)
}).catch(function (err) {
logger.warn(err);
console.log(err)
return res.status(500).send(error.SERVER_ERROR)
})
},
解决方案
您可以在文件中进行如下更改
应用程序.js
// modules =================================================
var express = require('express');
var app = express();
const logger = require('morgan');
var bodyParser = require('body-parser');
const cors = require('cors');
const path = require("path");
const config = require("./environments/index");
var http = require('http').Server(app);
var io = require('socket.io').listen(http);
const indexRouter = require("./routes/index");
// configuration ===========================================
var port = config.PORT || 8081; // set our port
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({
limit: '50mb',
extended: true,
parameterLimit: 50000
}));
app.use(cors());
app.use(logger('dev'))
app.use("/api", indexRouter);
app.use(express.static(path.join(__dirname, "/build")));
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
http.listen(port, () => {
console.log('Magic happens on port ' + port); // shoutout to the user
});
app.locals.io = io
exports = module.exports = app;
socket.io.js
let io;
const getSocketIo = (http) => {
let userId = 1
io = require('socket.io')(http);
io.sockets.on('connection', function (socket) {
io.sockets.adapter.rooms
if (io.nsps['/'].adapter.rooms["room-" + userId] && io.nsps['/'].adapter.rooms["room-" + userId].length > 0) userId++;
socket.join("room-" + userId);
//Send this event to everyone in the room.
io.sockets.in("room-" + userId).emit('connectToRoom', "You are in room no. " + userId);
console.log("new connection: " + socket.id);
console.log('socket connected')
});
}
module.exports = {
getSocketIo,
io
};
在您的控制器中,在您提到的 api 中添加此代码,只要您想使用套接字,请在使用之前添加此代码
const io = req.app.locals.io;
推荐阅读
- java - 在 REST Http web api 中发送一个包含 6 个事件的场景,每小时 x 次,持续时间为 y
- python-3.x - webdriver.Chrome(ChromeDriverManager().install(), options=options) 给出错误:SSLCertVerificationError
- android - Flutter AssetsAudio Player 在 Android 屏幕超时后停止
- jwt - OpenIddict 3 验证选项
- c# - 通过 C# 应用程序通过 gmail 发送电子邮件
- python - 试图在python中输入转义的十六进制字符
- python-3.9 - 在第 4 , 113 , 130 行制作井字游戏时输入错误
- python - 访问调用函数的 vars()
- vue.js - 在 Vue 模板中,元素标签之间的空格和新行不会被忽略
- linux - 用php从虚拟机(Linux)获取物理机信息