我想要提供一些文档页面。我不想写下面的内容,而是基本上为它们服务,而不必为每个页面编写代码:
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
?
答案 0 :(得分:1)
代码中的问题是传递给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);
});
})