我正在用Socket.IO开发我的第一个Node.js应用程序,一切都很好,但是现在该应用程序正在逐渐变大,我想将应用程序代码分成不同的文件,以进行更好的维护。
例如,我在主文件中定义了所有的猫鼬模式和路由。下面是用于socket.IO连接的所有功能。但是现在我想要为架构添加一个额外的文件,为路由添加一个额外的文件,为功能添加一个额外的文件。
当然,我知道可以编写自己的模块或使用require加载文件的可能性。这对我来说毫无意义,因为如果不将它们设置为全局,就无法使用app,io或db等var。如果将它们传递给模块中的函数,则无法更改它们。我想念什么?我想看一个示例,如何在不使用全局变量的情况下实际完成此操作。
听起来您的应用程序耦合度很高;您很难将代码拆分成模块,因为应用程序之间不应该相互依赖。展望OO设计的原则可以帮助在这里。
例如,如果您要将数据删除逻辑从主应用程序中分离出来,则应该能够这样做,因为数据库逻辑不应依赖于app或io-它应该能够独立工作,然后将require其分解为应用程序的其他部分以使用它。
app
io
require
这是一个相当基本的示例-比实际代码更多的伪代码,因为重点是通过示例演示模块化,而不是编写有效的应用程序。它也是您决定应用程序结构的众多方式中的仅一种。
// ============================= // 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);
这一切都花在了我头上,而对各种API的文档的检查却很少,但是我希望它能为您从应用程序中提取模块的方法打下基础。