ExpressJS - 路由功能

时间:2017-05-04 14:47:19

标签: node.js express

我为特定的服务器功能创建了一个单独的JS文件。示例代码如下:

我-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", myData.getData(request, response));行在

时不起作用
app.get("/get-data", function(request, response) {
        myData.getData(request, response);
});

确实

这两种方法有什么区别?

我更喜欢使用第一个,因为它干净而且精确,但我似乎无法使它工作。

1 个答案:

答案 0 :(得分: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参数提供函数,而只是从{{1}返回的值功能。

例如,如果您的功能是:

myData.getData(...)

function getData(req, res) { return 1; } 函数最终会执行以下操作:

get

在第二种情况下:

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

这现在传递匿名函数作为回调,在其中你只是调用自己的函数,因此将按预期工作。