2017-05-04 116 views
0

我爲特定的服務器功能創建了一個單獨的JS文件。示例代碼如下:ExpressJS - 路由功能

我-data.js

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

在我app.js,我試圖調用特定功能的請求已作出。 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

你有沒有試過:'app.get(「/ get-data」,myData.getData);'? –

+0

嗨@NelsonYeung,它確實有效。您是否希望將其作爲答案發布,以便將問題標記爲已回答?另外,你能否簡要解釋爲什麼我的方法不起作用? –

回答

1

app.get("/get-data", myData.getData);解決了這個問題。

app.get允許您提供回調函數,它是您提供的作爲第二個參數的回調函數。

我打算簡化這個問題並調用該函數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));,與第一種情況相同,您不再爲func參數提供一個函數,而只是從myData.getData(...)函數返回一個值。

例如,如果你的函數是這樣的:

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

get功能最終會做這樣的事情:

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

在第二種情況:

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

這現在通過一個匿名功能作爲回調和內部它你只是調用你自己的功能,因此將按預期工作。