提供一批动态页面

时间:2013-09-12 02:18:27

标签: node.js express pug

我想要提供一些文档页面。我不想写下面的内容,而是基本上为它们服务,而不必为每个页面编写代码:

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

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

无论如何要动态地提供一堆文件吗?是否需要为每个页面拨打pagePath

2 个答案:

答案 0 :(得分: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的链接。

答案 1 :(得分: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);
    });
})