[英]Separating socket IO calls for cleaner code in Node and Express
所以,我正在制作一個應用程序,並且我已經讓套接字 IO 工作,並且該應用程序只是在 Express 上運行。
無論如何,在主服務器文件中是我打電話的地方。 一些例子:
//Object 1
io.of('/type1').on
( 'connection', socket =>
{ socket.on
( 'call1', () =>
{ doSomething1();
}
);
}
);
// Object 2
io.of('/type2').on
( 'connection', socket =>
{ socket.on
( 'call2', () =>
{ doSomething2();
}
);
}
);
顯然,對各種對象有更多的 socket.on 調用。 我想要做的實際上是將這些對象的邏輯從主循環中分離到一些單獨的文件中,以更好地清理我擁有的主 server.js 文件。 我有大約 300 行各種套接字調用。
Object 1 等的 socketCalls1.js 之類的東西。
唯一的問題是 io 變量似乎不能在多個文件之間共享......有沒有一種好的、干凈的方法來做到這一點?
唯一的問題是 io 變量似乎無法在多個文件之間共享......
這不是真的。 您可以像任何其他變量一樣將io
變量傳入函數和傳出模塊。 也像任何其他變量一樣,它會自動私有地限定為單個文件。
有幾種方法可以跨文件共享對象,如果您已經走到這一步,我相信您已經使用了其中的大部分。 只是也許你可能沒有意識到你一直在做什么。
io
傳入函數。拆分邏輯的一種方法是將其拆分為多個模塊。 由於您可以將對象傳遞給函數,因此您的模塊應該導出函數。 例如:
文件 1:type1.js
function init (io) { io.of('/type1').on ( 'connection', socket => { socket.on ( 'call1', () => { doSomething1(); } ); } ); } module.exports = init;
文件2:type2.js
function init (io) { io.of('/type2').on ( 'connection', socket => { socket.on ( 'call2', () => { doSomething2(); } ); } ); } module.exports = init;
main.js
const type1 = require('./path/to/type1.js'); const type2 = require('./path/to/type2.js'); // some code to init your app... type1.init(io); // pass io to type1 module type2.init(io); // pass io to type2 module
這是因為io
只是一個常規變量。 就像任何變量一樣,您可以將其作為 function 參數傳遞。 這里沒有什么花哨的,這是編程語言的所有基本特征。
io
作為一個模塊。 另一種技術特定於模塊在 node.js 中的工作方式。 模塊是節點中的單例。 這意味着一個模塊恰好代表一個 object。 如果 3 個不同的文件require()
是模塊,它們都會得到相同的 object。
我們可以使用它在模塊之間共享io
object:
文件 1:服務器-init.js
let app = require('express')(); let http = require('http').Server(app); let io = require('socket.io')(http); module.exports = { app: app, http: http, io: io }
文件2:type1.js
const io = require('./path/to/server-init').io; // Alternatively you can use the syntax: // const { io } = require('./path/to/server-init'); function init () { io.of('/type1').on ( 'connection', socket => { socket.on ( 'call1', () => { doSomething1(); } ); } ); } module.exports = init;
文件 3:type2.js
const io = require('./path/to/server-init').io; function init () { io.of('/type2').on ( 'connection', socket => { socket.on ( 'call2', () => { doSomething2(); } ); } ); } module.exports = init;
main.js
const type1 = require('./path/to/type1.js'); const type2 = require('./path/to/type2.js'); const { http, app } = require('./path/to/server-init'); // some init code type1.init(); type2.init(); http.listen(PORT);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.