使用Express我想知道如何使用Node动态添加路由。在用户向我的element
输入一些信息之后,我需要生成我需要的路线,并且我一直试图通过For Loops完成此操作。
我发现路线本身有效。但是,要分配给它们的数据(在本例中为elementdata[i]
)不遵循for循环。在调用elementdata[i]
时,i === elementarray.length
。
我的代码看起来像这样。
for (i = 0; i < elementarray.length; i++){
app.get("/"+element[i], function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write(elementdata[i]);
res.end();
});
}
答案 0 :(得分:2)
您相应地获取数据
app.get('/:element', function(req, res) {
console.log(req.params.element);
});
这是此EXPRESSJS
的文档答案 1 :(得分:1)
首先,你不能以这种方式添加动态路径,因为在这种情况下app.get()是异步函数,所以这会给你带来不好的结果 - (在循环中读取异步函数) 通过这种方式,您应该使用参数,例如:
app.get('/:id', (req, res)=>{
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write(req.params.id);
res.end();
})
答案 2 :(得分:1)
这是预料之中的,因为当您的路线被称为&#39; for loop&#39;完成后,我= = elementarray.lenght并坐在全局执行上下文中。定义&#39; i&#39;使用&#39;让&#39;这将解决您的问题。然后它将创建多个&#39; i&#39;值并附加到app.get()执行上下文。
for (let i = 0; i < elementarray.length; i++){
app.get("/"+element[i], function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write(elementdata[i]);
res.end();
});
}
答案 3 :(得分:1)
i
变量会保持更改,因此您只会得到它的最后一个值(elementarray.length
)
for (i = 0; i < elementarray.length; i++){
addRoute(i)
}
function (i){
app.get("/"+element[i], function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write(elementdata[i]);
res.end();
});
}
如果将其移至分离的函数,则每次将其绑定到i
值的副本
或者你可以这样做:
for (let i = 0; i < elementarray.length; i++){
(function(i){
app.get("/"+element[i], function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write(elementdata[i]);
res.end();
})})(i);
}
每次都会创建一个i`变量的克隆。