13

node.jsアプリケーションをモジュール化しようとしています(エクスプレスフレームワークを使用)。私が抱えている問題は、ルートを設定するときです。

投稿に送信したデータを抽出できなくなりました。(req.bodyは未定義です)。これは、すべて同じファイルにある場合は問題なく機能します。ここで何が間違っているのでしょうか。また、node.jsでコードをモジュール化するための最良の方法は何ですか?

私のapp.js

require('./routes.js').setRoutes(app);

私のroute.js

exports.setRoutes = function(app){

  app.post('/ask', function(req, res, next){
    time = new Date();

    var newQuestion = {title: req.body.title, time: time.getTime(), vote:1};
    app.questions.push(newQuestion);
    res.render('index', {
      locals: {
        title: 'Questions',
        questions: app.questions
      }
    });
});
4

5 に答える 5

30

より良いアプローチ:

以下を含むroutes.jsファイルを作成します。

var index = require('./controllers/index');

module.exports = function(app) {
  app.all('/', index.index);
}

次に、server.js内から(またはサーバーを起動した方法で)、次のように要求します。

require('./routes')(app);

このようにして、多数の問題(テスト容易性、衝突など)をもたらすグローバル変数を作成する必要はありません。

于 2011-07-13T19:24:04.183 に答える
3

誰かがすでに答えていることに気づきましたが、とにかくこれが私がすることです。

app.js:

fs.readdir('./routes', function(err, files){
    files.forEach(function(fn) {
        if(!/\.js$/.test(fn)) return;
        require('./routes/' + fn)(app);
    });
});

./routes/index.js:

module.exports = function(app) {
        var data_dir = app.get('data-dir');

    app.get('/', function(req, res){
        res.render('index', {title: 'yay title'}
    });
}

たぶん誰かがこのアプローチが役立つと思うでしょう。

于 2012-08-05T21:55:37.463 に答える
2

私の問題は、アプリを間違った方法で宣言していたことでした。の代わりにvar app = module.exports = express.createServer();app = express.createServer();

そして、app.jsで行う必要があるのはrequire('./routes.js');。これで、routesファイルがapp変数にアクセスできるようになり、routesファイルで通常どおりルートを宣言できるようになりました。

(routes.js)

app.get('/test', function(req, res){
    console.log("Testing getter");
    res.writeHead('200');
    res.end("Hello World");
}); 
于 2011-02-24T06:09:34.163 に答える
0

私にとってのグローバルな「アプリ」(通常)。アプリがrequire()dにならないことがわかっていて、不器用でない場合は、操作がはるかに簡単です。

于 2011-10-05T20:09:32.810 に答える
0

app.jsの例

var users = require('./lib/users'); //this is your own module
app.use(users);

次に、lib / usersフォルダーにファイル(index.js、user.ejsなど)を作成します。デフォルトのモジュールロードにはindex.jsを使用します//index.jsvarexpress = require('express'); var app = module.exports = express();

app.set('views',__dirname);
app.set('view engine','ejs');
app.get('/users',function(req,res){
    //do stuffs here
});

ここでモジュラーnode.jes+Boostrapの例を作成しました:Nodemonkeyまたはここで家庭教師

于 2014-02-11T18:33:47.890 に答える