Javascript 路径:'/profile', pageParams:[], 查询参数:[], 委托人:是的, 对,, 组件:需要('./页面/配置文件'), restPath:“/api/1/profile”, 数据目标:“配置文件” }, 成员:{ 姓名:'成员', 路径:'/member/:id', pageParams:['id'], 查询参数:[], 委托人:是的, 对,, 组件:需要(“./页/成员”), restPath:“/api/1/member/:id”, 数据目标:“成员” }, 收件箱:{ 名称:“收件箱”, 路径:'/inbox', pageParams:[], 查询参数:[], 委托人:是的, 对,, 组件:需要(“./页面/收件箱”), restPath:null, 数据目标:空 }, 管理:{ 名称:'管理', 路径:'/admin', pageParams:[], 查询参数:[], 委托人:是的, 对,, 组件:需要(“./页/管理”), restPath:null, 数据目标:空 } };

Javascript 路径:'/profile', pageParams:[], 查询参数:[], 委托人:是的, 对,, 组件:需要('./页面/配置文件'), restPath:“/api/1/profile”, 数据目标:“配置文件” }, 成员:{ 姓名:'成员', 路径:'/member/:id', pageParams:['id'], 查询参数:[], 委托人:是的, 对,, 组件:需要(“./页/成员”), restPath:“/api/1/member/:id”, 数据目标:“成员” }, 收件箱:{ 名称:“收件箱”, 路径:'/inbox', pageParams:[], 查询参数:[], 委托人:是的, 对,, 组件:需要(“./页面/收件箱”), restPath:null, 数据目标:空 }, 管理:{ 名称:'管理', 路径:'/admin', pageParams:[], 查询参数:[], 委托人:是的, 对,, 组件:需要(“./页/管理”), restPath:null, 数据目标:空 } };,javascript,node.js,express,Javascript,Node.js,Express,启动节点应用程序时,我会得到以下输出: Home => / Search => /search Register => /register Activate => /activate ForgotPassword => /forgot-password ResetPassword => /reset-password Login => /login Profile => /profile Member => /member/:id Inbox

启动节点应用程序时,我会得到以下输出:

Home => /
Search => /search
Register => /register
Activate => /activate
ForgotPassword => /forgot-password
ResetPassword => /reset-password
Login => /login
Profile => /profile
Member => /member/:id
Inbox => /inbox
Administration => /admin
当我进入浏览器中的某个页面时,我会得到以下控制台输出:

/matched/admin

这显然是错误的

你知道这是怎么回事吗?

你应该换个新的

for (var pageKey in Page) {
  if (Page.hasOwnProperty(pageKey)) {
    // ...
  }
}

否则,您在路由处理程序中对
页面
的引用将不是您所期望的,从外观上看,这可能是导致问题的原因

之所以
页面
引用意外值,是因为
for
while
do
等不在其块内为代码创建闭包。因此,
page
被提升到最近的闭包(
then()
回调),并且它的值被重新分配给循环的每个迭代。但是,当您的路由处理程序函数实际执行时,
page
指向循环执行期间(过去)设置的最后一个值。
页面
的最后一个值将是管理路由,因为这是
页面
中的最后一个属性值


使用
forEach()。循环继续。请尝试返回语句或res.send或沿着这些行执行的某些操作。当服务器启动时,
for
循环在
pgrest
组件初始化之后只迭代一次。与您的问题无关,只在您的代码上:当您包括
pg promise
时,也不要包括
pg
,因为
pg-promise
公开了初始化后通过属性
pg
使用的
pg
,即
require(/*options*/).pg
。这实际上是我自己的小库,不是。话虽如此,
pg
是一个古老的
require
我还没来得及删除它。而且,
pgpromise
本身也不再在主js文件中使用。它都封装在
pgrest
(我的另一个小库)中,它将遍历页面键,而不是页面对象。但我会尝试这种迭代方式,看看会发生什么。这种迭代方式有效,我希望你在我接受之前纠正答案。它应该是
Object.keys(Page).forEach(函数(pageKey){var Page=Page[pageKey];/*…*/})解决了这个问题,但我仍然不知道为什么,因为我们仍然在同一
页面
对象中按键查找对象。@SteveTaylor我在回答中对此做了更多解释。我希望这能让事情更清楚一点。谢谢你的解释!问题似乎在于愚蠢的JavaScript变量范围。变量的作用域是函数而不是块,因此在
循环中使用
for
-
,只有一个
页面
变量,在调用任何请求处理程序时,它指向最后一个变量,即
页面.Administration
。额外的闭包解决了这个问题。
Object.keys(Page).forEach(function(pageKey) {
  // ...
});