在不同的文件中分割节点应用程序

我正在用Socket.IO开发我的第一个Node.js应用程序,一切正常,但现在应用程序正在慢慢变大,我想将应用程序代码分成不同的文件,以便更好的维护。

例如,我在主文件中定义了所有的mongoose模式和路由。 下面是socket.IO连接的所有function。 但现在我想为模式有一个额外的文件,一个额外的路由文件和一个function。

当然,我意识到可以编写自己的模块或加载一个带有require的文件。 这对我来说是没有意义的,因为我不能使用像app,io或db这样的variables而不把它们变成全局variables。 如果我将它们传递给模块中的函数,我不能改变它们。 我错过了什么? 我想看一个例子,如何在不使用全局variables的情况下在实践中完成

这听起来像你有一个高度耦合的应用程序; 你很难把你的代码分解成模块,因为那些不相互依赖的应用程序可以做到这一点。 研究面向对象devise的原理可能会有所帮助。

例如,如果您要将数据库逻辑从主应用程序中分离出来,则应该可以这样做,因为数据库逻辑不应该依赖于appio – 它应该能够独立运行,而您require其用于其他应用程序以使用它。

这是一个相当基本的例子 – 它比实际的代码更伪代码,因为重点是通过示例演示模块化,而不是写一个工作的应用程序。 这也只是您决定构build应用程序的许多方法之一。

 // ============================= // db.js var mongoose = require('mongoose'); mongoose.connect(/* ... */); module.exports = { User: require('./models/user'); OtherModel: require('./models/other_model'); }; // ============================= // models/user.js (similar for models/other_model.js) var mongoose = require('mongoose'); var User = new mongoose.Schema({ /* ... */ }); module.exports = mongoose.model('User', User); // ============================= // routes.js var db = require('./db'); var User = db.User; var OtherModel = db.OtherModel; // This module exports a function, which we call call with // our Express application and Socket.IO server as arguments // so that we can access them if we need them. module.exports = function(app, io) { app.get('/', function(req, res) { // home page logic ... }); app.post('/users/:id', function(req, res) { User.create(/* ... */); }); }; // ============================= // realtime.js var db = require('./db'); var OtherModel = db.OtherModel; module.exports = function(io) { io.sockets.on('connection', function(socket) { socket.on('someEvent', function() { OtherModel.find(/* ... */); }); }); }; // ============================= // application.js var express = require('express'); var sio = require('socket.io'); var routes = require('./routes'); var realtime = require('./realtime'); var app = express(); var server = http.createServer(app); var io = sio.listen(server); // all your app.use() and app.configure() here... // Load in the routes by calling the function we // exported in routes.js routes(app, io); // Similarly with our realtime module. realtime(io); server.listen(8080); 

这一切都是从头开始写的,尽量less检查各种API的文档,但是我希望能够为您从应用程序中提取模块的方式提供种子。