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) {
// ...
});