【问题标题】:Remove self route mapping in express js on runtime在运行时删除 express js 中的自我路由映射
【发布时间】:2016-05-04 16:21:40
【问题描述】:

我想做的是,每次调用 /some_abc 时,都会使用新名称 /XYZuid_P 映射一些 POST data uid 新路由。这是我的代码

var app = require('express')
app.post('/some_abc', function (req, res) {
    app.post('/' +req.body.uid+ '_P', function (reqa, resa) {
        console.log("URL: %s",reqa.url);
        //here TODO
        resa.end();
    });
  res.end();
});

我可以用这段代码映射新路线。 现在我想删除这条/XYZuid_P 路由,每当/XYZuid_P 被调用时。

我尝试向Remove route mappings in NodeJS Express 寻求帮助,但无法删除路由。它正在给TypeError: Cannot read property 'post' of undefined

如果我正在打印console.log(app._router);,我可以在列表中看到新添加的路线。

请帮助如何,我可以自己删除路线。

【问题讨论】:

  • 如果我没听错,那么您是在尝试创建临时路线?
  • 是的,然后删除它
  • 检查我的答案。唯一的问题是我还没有测试过。
  • 对于我的项目,我需要这种类型的东西,有一个临时的post api,应该在调用后删除!只是我正在寻找如何在运行时删除它!
  • 我已经测试过了,所有解决方案都给出了删除路线,没有任何效果,虽然我得到了解决方案,发布在下面!

标签: node.js express


【解决方案1】:

这是我对问题的解决方案:

  1. 维护一个临时路由表:
var tempRoutes = {};
  1. 创建新的临时路由:
app.post('/some_abc', function (req, res) { tempRoutes[req.body.uid+ '_P'] = 函数(请求,响应){ // 处理请求和响应 }; 重发(); });
  1. 使用(和删除)临时路由:
app.post('/*_P', function(req, res) { // 这将匹配任何以“_P”结尾的路由 var path = req.path.substring(1); // 从 req 对象中获取临时路由名称 if(tempRoutes[path]) { // 检查临时路由是否存在 var routeFunction = tempRoutes[路径]; delete tempRoutes[path] // 删除临时路径 routeFunction.apply(this, [req, res]); // 应用临时路由函数 } 别的 { // 处理 404 } });

注意:

  1. 经过测试,对我有用。

  2. 可以轻松扩展以包含不同的路径动词。

【讨论】:

  • 我在node方面经验不多,我想知道tempRoutes[req.body.uid+ '_P'] = function (request, response) { // handle the request and response };这部分和app.post('/' +req.body.uid+ '_P', function (reqa, resa) { // handle the request and response }); 类似,tempRoutes会不会也监听post请求?
  • 不,tempRoutes 只是一个包含路由函数的对象。 app.post('/*_P', function(req, res) { ... });实际上是在监听post请求并选择将post请求转发到哪个临时路由(来自tempRoutes)。
  • 加注,回馈Cannot POST /UIDxyz_P
  • 我刚刚对其进行了测试,它可以成功运行,无需对我的代码进行任何进一步的更改。检查您是否犯了任何错误。
  • 你测试了哪个版本的nodejs?
【解决方案2】:

找到了简单的解决方案,分享一下

var app = require('express')
app.post('/some_abc', function (req, res) {
    app.post('/' +req.body.uid+ '_P', function (reqa, resa) {
        //This code is removing self route when called next time
        var i=6; // before 6th index route don't exists
        while(app._router.stack[i]){
            if(app._router.stack[i++].route.path == req.url)
                    break;
        }
                                       // i is giving the index location
        app._router.stack.splice(i,1); // this line is responsible for deleting
        resa.end();
    });
  res.end();
});

所有映射的路由都保存在app._router.stack,只需编辑这个对象我们就可以在运行时修改路由。

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2023-03-10
    • 2023-04-11
    相关资源
    最近更新 更多