2

私はNode.jsの初心者で、このコードで問題が発生していました。

var fs = require('fs');

Framework.Router = function() {

    this.run = function(req, res) {
        fs.exists(global.info.controller_file, function(exists) {
            if (exists) {
                            // Here's the problem
                            res.writeHead(200, {'Content-Type':'text/html'});
                var cname = App.ucfirst(global.info.controller)+'Controller';
                var c = require(global.info.controller_file);
                var c = new App[cname]();
                var action = global.info.action;
                c[action].apply(global.info.action, global.info.params);
                            res.end();
            } else {
                App.notFound();
                return false;
            }
        });
    }
};

問題は、「global.info.controller_file」が存在するかどうかを確認した後の部分にあります。コードが内部で正しく機能しないようです:if(exists){... NOTWORKING }ログアウトしようとしましたそのセクションのすべての変数の値であり、それらには期待値がありますが、行:c[action].apply(global.info.action, global.info.params); は期待どおりに実行されていません。これは、controller_file内の関数を呼び出すことになっており、単純なを実行することになっていますres.write('hello world');。を使用してファイルのチェックを開始する前は、この問題は発生していませんでしたfs.existsifステートメント内のすべては、このチェックの前に完全に正常に機能しました。

コードが期待どおりに実行されないのはなぜですか?リクエストがタイムアウトするのはなぜですか?それは同期と非同期の全体と関係がありますか?(申し訳ありませんが、私は完全な初心者です)

ありがとうございました

4

1 に答える 1

4

他の人がコメントしているように、コードを書き直してNode.jsデザインパターンとより一致させるようにしてから、問題がまだ存在するかどうかを確認することをお勧めします。それまでの間、役立つ可能性のあるものがあります。

require「実行時」に動的に使用しないことについてのアドバイスに注意する必要がありfs.exists()、すべての要求を呼び出すことは非常に無駄です。ただし、すべての* .jsファイルをディレクトリ(おそらく「controllers」ディレクトリ)にロードするとします。これは、index.jsファイルを使用して行うのが最適です。

たとえば、次のように保存しますapp/controllers/index.js

var fs = require('fs');
var files = fs.readdirSync(__dirname);
var dotJs = /\.js$/;
for (var i in files) {
    if (files[i] !== 'index.js' && dotJs.test(files[i]))
        exports[files[i].replace(dotJs, '')] = require('./' + files[i]);
}

次に、の先頭にapp/router.js次を追加します。

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

app/controllers/test.jsこれで、を使用してモジュールにアクセスできますcontrollers.test。したがって、代わりに:

fs.exists(controllerFile, function (exists) {
    if (exists) {
        ...
    }
});

単に:

if (controllers[controllerName]) {
    ...
}

このようにして、不要なディスクIOなしで必要な動的機能を保持できます。

于 2013-03-31T07:17:36.080 に答える