[英]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.js
而server.js
正在加載app.js
對於這種類型的代碼,您不能這樣做。
它因為你試圖加載問題server.js
從內部app.js
,然后在加載過程server.js
,它會嘗試加載app.js
並獲得其出口,但app.js
還沒有結束正在加載,因此還沒有退還其出口。 因此,加載器認為沒有導出,或者識別了循環請求(我不確定是哪個),但是由於循環的需要,無論哪種情況, app.js
的導出都不起作用。
有幾種解決方法。 兩種最常見的方式是:
將一些代碼分解到一個通用的第三模塊中,每個模塊都可以加載,而其中一個只能加載另一個。
不是讓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.