Node.js将对象从server.js传递到外部模块?

时间:2015-12-16 00:07:39

标签: javascript node.js

我在server.js文件的顶部有这些声明

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    mongoose = require('mongoose'),
    bodyParser = require('body-parser'),
    apiRouter = require('./app/routes/api.js'),
    socketEvents = require('./app/modules/socketEvents.js')(server);

所以我试图将'server'var传递给我的socketEvents模块,上面的方法似乎没有用。它在我的Node.JS控制台中抛出一个错误,在socketEvents.js的第1行没有定义'server',我将在下面发布。

socketEvents.js

var io = require('socket.io')(server),
    matchMakingQueue = [];

io.on('connection', function(socket) {

    socket.on('joinMatchMaking', function(data) {
        //Every time a player joins the matchmaking queue, check if a game can be created.
        matchMakingQueue.push(data);
        var matchedPlayers = [];
        for (i = 0; i < matchMakingQueue.length; i++) {
            switch (data.gameType) {
                case '1v1':
                    matchedPlayers.push(matchMakingQueue[i].username);
                    if (matchedPlayers.length == 2) {
                        socket.emit('matchFound', {players: matchedPlayers});
                    } 
                    console.log('user joined 1v1 queue');
                case '2v2':
                    matchedPlayers.push(matchMakingQueue[i].username);
                    if (matchedPlayers.length == 4) {
                        socket.emit('matchFound', {players: matchedPlayers});
                    } 
                    console.log('user joined 2v2 queue');
            }
        }
        console.log(data.username + ' joined the ' + data.gameType + ' matchmaking queue');
        console.log('users in queue: ' + matchMakingQueue.length);
    });

    socket.on('leaveMatchMaking', function(username) {
        matchMakingQueue.splice(matchMakingQueue.indexOf(username), 1);
        console.log(username + ' left matchmaking queue.');
        console.log('users in queue: ' + matchMakingQueue.length);
    });

});

server.js

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    mongoose = require('mongoose'),
    bodyParser = require('body-parser'),
    apiRouter = require('./app/routes/api.js'),
    socketEvents = require('./app/modules/socketEvents.js')(server);

//Clears Node Console.
process.stdout.write('\033c');
console.log('Server starting!');

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json())

app.use('/api', apiRouter);
app.use(express.static('public'));

app.use('*', function(req, res, next) {
    //All requests return single page angular application.
    res.sendFile(__dirname + '/public/index.html');
});

mongoose.connect('localhost', 'triviaattack', function(err) {
    if (err) {
        console.log('An error occured when connecting to the MongoDB Database');
        throw err;
    }
});

server.listen(1337);

2 个答案:

答案 0 :(得分:2)

将其包装在您应导出的功能中。

function wrap(server){
    var io = require('socket.io')(server),
        matchMakingQueue = [];

    io.... //rest goes here
}

module.exports = wrap;

答案 1 :(得分:2)

在socketEvents.js

var sockets = require('./socketEvents'),
    express = require('express'),
    app = express(),
    server = require('http').createServer(app), 
    ...
    ...

sockets(server);

在server.js中:

var sockets = require('./socketEvents')
server = require('http');

sockets(server);

基本上,您从要使用它们的位置导出该函数,然后在server.js中要求这些文件。

示例项目:

server.js:

function sockets(server) {
  console.log("Hello");
  console.log(server);
}

module.exports = sockets;

socketEvents.js:

public void onLocationChanged(Location location) {
    list.add(new LatLng(location.getLatitude(),location.getLongitude()));
}

//and after run it throw nullPointerExeption.... 

两个文件都在同一个文件夹中。 运行:节点服务器

结果: enter image description here

相关问题