簡體   English   中英

導出HTTP服務器以獲取socket.io無法正常工作

[英]Exporting HTTP server for socket.io not working

我有一個app.js

const express = require('express');
const app = express();
const server = require('./server.js');

// app.use
const io = require('socket.io').listen(server);
io.on('connection', function (socket) {
   ...
});

module.exports = app;

還有一個server.js

const app = require('./app');
const server = app.listen(5000 || process.env.PORT, () => {
    console.log('App listening on port 5000!');
})
module.exports = server;

如果將服務器放在單獨的文件中,則套接字無法正常工作,但是如果我在app.js啟動服務器,則套接字可以正常工作。 我做錯了什么?

這里的問題是,您有一個循環依賴關系,其中app.js正在加載server.jsserver.js正在加載app.js 對於這種類型的代碼,您不能這樣做。

它因為你試圖加載問題server.js從內部app.js ,然后在加載過程server.js ,它會嘗試加載app.js並獲得其出口,但app.js還沒有結束正在加載,因此還沒有退還其出口。 因此,加載器認為沒有導出,或者識別了循環請求(我不確定是哪個),但是由於循環的需要,無論哪種情況, app.js的導出都不起作用。

有幾種解決方法。 兩種最常見的方式是:

  1. 將一些代碼分解到一個通用的第三模塊中,每個模塊都可以加載,而其中一個只能加載另一個。

  2. 不是讓server.js加載app來獲取app對象,而是讓app.js通過構造函數將app對象傳遞給server.js ,而不是嘗試在模塊加載時執行。

這是構造函數的想法的工作方式:

app.js

const express = require('express');
const app = express();

// load server.js and call it's constructor, passing the app object
// that module constructor function will return the server object
const server = require('./server.js')(app);

// app.use
const io = require('socket.io').listen(server);
io.on('connection', function (socket) {
   ...
});

module.exports = app;

server.js

// export constructor function that must be called to initialize this module
module.exports = function(app) {

    const server = app.listen(5000 || process.env.PORT, () => {
        console.log('App listening on port 5000!');
    });
    return server;
};

因此,不是server.js嘗試加載app.js模塊以獲取app對象,而是使用構造函數將app對象“推送”到該對象。 這樣可以防止循環依賴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM