2013-03-18 36 views
2

基于我的功能关闭answer to this question,我写了此功能来删除现场(使用Express和节点)的路线。在运行时删除Node.js中的特定映射路由会删除静态映射吗?

function deleteRoute(url) { 


for (var i = app.routes.get.length - 1; i >= 0; i--) { 
    if (app.routes.get[i].path === "/" + url) { 
    console.log(app.routes.get[i]); 
    delete app.routes.get[i]; 
    console.log(app.routes.get) 
    } 
} 
} 

然而,当我运行这个它似乎也删除路由我所有的静态页面,这是宣布在启动时是这样的:

app.use(express.static(__dirname + '/components')); 

我一直在摔跤这个了而似乎无法控制它。任何人都可以帮忙吗?每当我在app.routes.get之前和之后登录时,它看起来就像操作正确。

具体来说,这是重装任何静态页面的路径被删除后,当我得到的错误:

TypeError: Cannot call method 'match' of undefined 

这里是删除前app.routes:

{ get: 
    [ { path: '/', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/\/?$/i, 
    params: [] }, 
{ path: '/index.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/index\.html\/?$/i, 
    params: [] }, 
{ path: '/how_it_works.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/how_it_works\.html\/?$/i, 
    params: [] }, 
{ path: '/about.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/about\.html\/?$/i, 
    params: [] }, 
{ path: '/contribute.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/contribute\.html\/?$/i, 
    params: [] }, 
{ path: '/contact.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/contact\.html\/?$/i, 
    params: [] }, 
{ path: '/a.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/a\.html\/?$/i, 
    params: [] } ], 
post: 
[ { path: '/admin-save.json', 
    method: 'post', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/admin-save\.json\/?$/i, 
    params: [] }, 
{ path: '/page-edit.json', 
    method: 'post', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/page-edit\.json\/?$/i, 
    params: [] }, 
{ path: '/get-pages.json', 
    method: 'post', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/get-pages\.json\/?$/i, 
    params: [] }, 
{ path: '/admin-delete.json', 
    method: 'post', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/admin-delete\.json\/?$/i, 
    params: [] } ] } 

这里之后:

{ get: 
[ { path: '/', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/\/?$/i, 
    params: [] }, 
{ path: '/index.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/index\.html\/?$/i, 
    params: [] }, 
{ path: '/how_it_works.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/how_it_works\.html\/?$/i, 
    params: [] }, 
{ path: '/about.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/about\.html\/?$/i, 
    params: [] }, 
{ path: '/contribute.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/contribute\.html\/?$/i, 
    params: [] }, 
{ path: '/contact.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/contact\.html\/?$/i, 
    params: [] }, 
    ], 
post: 
    [ { path: '/admin-save.json', 
    method: 'post', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/admin-save\.json\/?$/i, 
    params: [] }, 
{ path: '/page-edit.json', 
    method: 'post', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/page-edit\.json\/?$/i, 
    params: [] }, 
{ path: '/get-pages.json', 
    method: 'post', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/get-pages\.json\/?$/i, 
    params: [] }, 
{ path: '/admin-delete.json', 
    method: 'post', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/admin-delete\.json\/?$/i, 
    params: [] } ] } 
+1

你可以在调用'deleteRoute()'的时候执行一个'console.log(app.routes)',所以我们可以使用一些东西? – Brad 2013-03-18 21:47:49

+0

@Brad补充!非常感谢您的关注! – streetlight 2013-03-18 21:55:43

+0

任何倾向,为什么会发生这种情况?我非常茫然,因为如果你只是阅读日志,它似乎正在工作! – streetlight 2013-03-18 22:46:36

回答

5

deletedelete用于从对象中删除键,而不是用于删除条目来自阵列。通过调用delete,您实际上将该阵列位置的值设置为undefined,因此Express在通过路径查看时仍会尝试处理该路由。

注意你输入之前:

{ path: '/contact.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/contact\.html\/?$/i, 
    params: [] }, 
{ path: '/a.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/a\.html\/?$/i, 
    params: [] } ], 

VS后:

{ path: '/contact.html', 
    method: 'get', 
    callbacks: [Object], 
    keys: [], 
    regexp: /^\/contact\.html\/?$/i, 
    params: [] }, 
    ], 

你删除的 'a.html' 路径,但要注意,那里仍是contact.html对象后,。这是因为数组条目仍然存在,它没有任何价值。

您需要使用splice删除条目。

function deleteRoute(url) { 
    for (var i = app.routes.get.length - 1; i >= 0; i--) { 
    if (app.routes.get[i].path === "/" + url) { 
     app.routes.get.splice(i, 1); 
    } 
    } 
} 

这种方法也对你在你的问题联系到问题的第二个答案中指出。

+0

这是完美的!我知道我错过了这样一件小事,把整件事情都抛弃了。你是一个救星! – streetlight 2013-03-19 21:23:46