从server.js导出socket.io

时间:2019-09-10 13:32:32

标签: node.js sockets express socket.io

我的文件夹结构如下:

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] }

0 个答案:

没有答案