2017-05-04 14 views
0

私は、特定のサーバー機能用に別のJSファイルを作成しました。次のようにサンプルコード:私のapp.jsExpressJS - ルーティング機能

私-data.js

var exports = module.exports = {}; 
exports.getData = function (request, response) { 
    var myData = [ 
     { 
      "value": 1 
     }, 
     { 
      "value": 2 
     }, 
    ]; 
    response.json(myData); 
}; 

、私は、要求が行われたときに特定の機能を呼び出すようにしようとしています。

app.js

var express = require("express"); 
var app = express(); 
var port = process.env.PORT || 3000; 
var myData = require("./lib/my-data.js"); 

app.engine(".html", require("ejs").__express); 
app.set("views", __dirname + "/views"); 
app.set("view engine", "html"); 
app.use(express.static(__dirname)); 

// Line below is what I'm trying to achieve. 
//app.get("/get-data", myData.getData(request, response)); 

// Working line 
app.get("/get-data", function(request, response) { 
    myData.getData(request, response); 
}); 

app.get("*", function (request, response) { 
    response.render("index"); 
}); 

app.listen(port, function() { 
    console.log("Listening on port " + port); 
}); 

のワーキングサンプルは

app.get("/get-data", function(request, response) { 
     myData.getData(request, response); 
}); 

はありませんしながら、ラインapp.get("/get-data", myData.getData(request, response));が動作しないことを私に悩まします。

2つのアプローチの違いは何ですか?

私はそれはきれいで正確なのですが、私はそれを動作させるように見えることはできませんので、最初のものを使用して好みます。

+2

あなたが試してみました: 'app.get( "/データ取得"、myData.getDataを);'? –

+0

こんにちは@NelsonYeung、それは働いた。あなたはその質問を答えとしてタグ付けすることができるように答えを投稿したいですか?また、私のアプローチがうまくいかなかった理由を簡単に説明できますか? –

答えて

1

app.get("/get-data", myData.getData);修正この問題。

app.getは、あなたが2番目のパラメータとして供給するものですコールバック関数を供給することができます。

私は、この問題を単純化し、その関数を呼び出すget(string, func)するつもりです。

function get(string, func) { 
    var request = "foo"; 
    var response = "bar"; 
    // ... 
    func(request, response); 
} 

をだから、あなたはそれが正しく機能を呼び出すするのでapp.get("/get-data", myData.getData);作品、関数の名前を渡す必要がありました。この関数の内部では、通常、あなたが供給関数を呼び出すために起こっています。

get("/get-data", myData.getData(request, response));のように2番目のパラメータを指定すると、funcパラメータは関数でなく、myData.getData(...)関数から返された値になります。例えば

、あなたの関数は、このの場合:第二ケースで

get("foo", 1) { 
    // ... 
    1(request, response); 
} 

function getData(req, res) { 
    return 1; 
} 

get機能のようなものをやってしまいます

app.get("/get-data", function(request, response) { 
    myData.getData(request, response); 
}); 

この今すぐ匿名関数をコールバックとその内部では、あなた自身の関数を呼び出しているだけなので、期待どおりに動作します。

関連する問題