我的文件夹结构如下:
server
- routes
-- api
--- otherfile.js
server.js
我正在从server.js文件中运行socket.io,并且一切正常,如下所示:
// Set up server
const express = require('express');
const axios = require("axios");
const app = express();
const server = app.listen(port);
require('./routes')(app);
// Set up socket.io
var io = require("socket.io")(server);
// Method for socket.io
const getApiAndEmit = async socket => {
try {
// get data from API
const res = await axios.get("https://api.darksky.net/forecast/XXXX/37.8267,-122.4233");
// emit event from socket
socket.emit("FromAPI", res.data.currently.temperature);
} catch (error) {
console.error(`Error ${error.code}`);
}
}
// Set up interval for socket
let interval;
// Logic for socket
io.on('connection', socket => {
console.log('New client connected');
if (interval) {
clearInterval(interval); // clear interval on subsequent connections
}
interval = setInterval(() => getApiAndEmit(socket), 10000);
socket.on('disconnect', () => {
console.log("client disconnected");
})
})
现在我需要导出io,以便可以在另一个文件中使用它,并且我已经尝试过:
添加到server.js的底部
module.exports = io
OR
module.exports = { io: io }
Otherfile.js(导入到/routes/api/otherfile.js)
let socket = require('../../server'); //the module is found OK
socket.on("connection", socket => {
console.log('client connected');
})
我正在获取socket.on不是函数错误。
另一种方法失败 同时,我尝试了另一种方法,并且该方法可用于与server.js文件位于同一目录中的新文件,但是当我尝试将代码导入到/routes/api/otherfile.js时,无法读取属性空
创建了io.js(与server.js位于同一目录中)
var sio = require('socket.io');
var io = null;
exports.io = function () {
return io;
};
exports.initialize = function (server) {
return io = sio(server);
};
Test.js(与server.js相同的目录,并且按预期工作)
require('./io').io().on('connection', socket => {
console.log('testing')
})
Otherfile.js(/routes/api/otherfile.js和throws无法读取null的属性“ on”)
require('../../io').io().on('connection', socket => {
console.log('testing')
})
另外,
我可以从test.js和otherfile.js控制台记录require语句,并且它们都返回相同的内容。
Test.js Log
console.log(require('./io')); //{ io: [Function], initialize: [Function] }
Otherfile.js Log
console.log(require('../../io')); //{ io: [Function], initialize: [Function] }