5

私はSocket.IOを使用して最初のNode.jsアプリを開発していますが、すべて問題ありませんが、アプリは徐々に大きくなっているため、メンテナンスを改善するためにアプリコードをさまざまなファイルに分割したいと思います。

たとえば、メインファイルですべてのマングーススキーマとルーティングを定義しています。その下には、socket.IO接続のすべての機能があります。しかし、ここで、スキーマ用の追加ファイル、ルーティング用の追加ファイル、および関数用の追加ファイルが必要です。

もちろん、私は自分のモジュールを書いたり、requireを使ってファイルをロードしたりする可能性を認識しています。app、io、dbなどの変数をグローバルにしないと操作できないため、これは私には意味がありません。そして、それらをモジュール内の関数に渡した場合、それらを変更することはできません。私は何が欠けていますか?グローバル変数を使用せずにこれが実際にどのように行われるかの例を見てみたいと思います。

4

1 に答える 1

15

高度に結合されたアプリケーションがあるようです。相互に依存してはならないアプリケーションの一部が行うため、コードをモジュールに分割することは困難です。ここでは、オブジェクト指向デザインの原則を調べることが役立つ場合があります。

たとえば、データベースロジックをメインアプリケーションから分割する場合、データベースロジックはappまたはに依存してはならないため、分割ioできるはずです。requireそれを使用するためのアプリケーションの他の部分。

これはかなり基本的な例です。ポイントは、動作するアプリケーションを作成するのではなく、例によってモジュール性を示すことであるため、実際のコードよりも擬似コードです。これは、アプリケーションを構造化することを決定する可能性のある多くの方法の1つにすぎません。

// =============================
// 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のドキュメントを最小限にチェックすることで頭から離れて書かれましたが、アプリケーションからモジュールを抽出する方法の種が植えられることを願っています。

于 2012-11-11T19:13:50.067 に答える