0

我有一些我想提供的文档页面。我不想编写类似下面的内容,而是想基本上将它们全部提供服务,而不为每个页面编写此代码:

jade.renderFile("/documentation/gettingStarted", {}, function(err, str) {
    if(err) throw err;
    response.send(str);
});

我还想在这些页面的底部有一个简单的“下一页”,顺序在以下数组中定义:

var pages = ["installation", "gettingStarted"];

我坚持的部分是迭代数组中的每个页面app.get

for(var i = 0; i < pages.length; i++) {
    var pagePath = "documentation/" + pages[i];

    app.get("/" + pagePath, function(request, response) {
        jade.renderFile(pagePath + ".jade", {}, function(err, str) {
            if(err) throw err;
            response.send(str);
        });
    });
}

有了上面的块,我希望它会为以下请求提供页面服务:

  • /documentation/installation
  • /documentation/gettingStarted

它适用于一个页面,但由于jade.renderFile(...)在 GET 上调用,它只会使用初始化留下的变量,这意味着两个页面将只返回最后一页(gettingStarted),因为pagePath两个请求都将保持相同。

反正有动态服务一堆文件吗?是否需要app.get为每个单独的页面进行调用?

4

2 回答 2

1

Trevor Dixon 指出 - 如何使用闭包。谢谢。

您的代码中的问题是传递给 app.get 的回调函数从外部范围引用了一个变量,即 pagePath,该变量在循环的下一次迭代中被更改。闭包很好地解决了它。

for(var i = 0; i < pages.length; i++) {
    var pagePath = "documentation/" + pages[i];

    app.get("/" + pagePath, 
        function(myPagePath){ //closure function recieving pagePath different for each iteration
            return function(request, response) { //return a new function
                jade.renderFile(myPagePath + ".jade", {}, function(err, str) { //myPagePath is a my own copy of pagePath
                if(err) throw err;
                response.send(str);
            });
        }(pagePath) //lets pass value of pagePath from current iteration
    );
}

我们使用“return function”语句为每次迭代创建一个新的回调函数,该语句从其直接父范围访问 myPagePath。有关闭包的更多信息,请参阅 Trevor 的链接。

于 2013-09-12T07:20:11.400 回答
0

使用请求参数。http://expressjs.com/api.html#req.params

var pages = ['installation', 'gettingStarted'];

app.get('/documentation/:page', function(req, res, next) {
    var page = req.params.page;

    if (pages.indexOf(page) === -1) return next();

    jade.renderFile('documentation/' + page + '.jade', {
        pages: pages,
        nextPage: pages[pages.indexOf(page) + 1]
    }, function(err, str) {
        if(err) throw err;
        res.send(str);
    });
})
于 2013-09-12T02:26:29.800 回答