javascript – 重新定义处理程序的动态下降

上下文

我正在尝试用repify(2.6.2)构建一个动态服务器,其中一旦服务器启动就要安装和卸载服务.我意识到这可以被看作是奇怪的,但是在面向DSL的项目的背景下它是有意义的.为了实现这一目标,我实现了以下功能:

var install = function (path,method,handler) { 
    var id = server[method](path,function (request,response) { // [1]
        handler (request,response);
    });
    return id;
} 
var uninstall = function (id) { 
    delete server.routes[id]; // [2]
}

安装功能,在由路径指定的路由和方法名称[1]中安装一个处理程序.卸载功能,通过将其从routes [2]中删除来卸载处理程序.此功能通过以下代码显示为服务:

var db = ...
var server = restify.createServer ()
    .use (restify.bodyParser ({ mapParams: false }))
    .use (restify.queryParser ())
    .use (restify.fullResponse ());
service.post ('/services',response) {
   var path    = request.body.path;
   var method  = request.body.method;
   var handler = createHandler (request.body.dsl) // off-topic
   var id = install (path,handler)
   db.save (path,id); // [3]
});
service.del ('/services',response) {
   var path   = request.body.path;
   var method = request.body.method;
   var id     = db.load (path,method); // [4]
   uninstall (id);
});

在post方法[3]中,从body获取一个处理程序(它是非主题的,如何进行),并且安装了一个将返回的id存储在数据库中的服务. del方法[4]从数据库中检索id并调用卸载功能.

问题

该代码已经过单元测试,它可以正常工作,但是当我尝试执行如下所示的安装/卸载顺序时,会出现故障.在这个例子中,请假设所有请求的正文包含相同的路径,http动词和适当的内容来构建一个正确的处理程序:

/*
post: /services : Installed          -> ok
del:  /services : Resource not found -> ok
post: /services : Resource not found -> Error :(
*/

在第一次安装中,当通过路径和动词加入资源时,执行处理程序.由于在动态访问路径时获得资源未找到的消息,卸载请求已正确完成.然而,当在服务器中安装相同的主体时,当路径被添加到动词时,将返回未找到的资源.

我想这个错误在[2],因为可能是,我没有使用正确的注销策略来重新定义.

一旦服务器启动,怎么能有效地减少处理程序的重新定义?

解决方法

在查看重新发布源后,我发现以下内容,您可能想尝试,而不是简单地“删除”( https://github.com/restify/node-restify/blob/master/lib/server.js).
/*
* Removes a route from the server.
* You pass in the route 'blob' you got from a mount call.
* @public
* @function rm
* @throws   {TypeError} on bad input.
* @param    {String}    route the route name.
* @returns  {Boolean}         true if route was removed,false if not.
*/
Server.prototype.rm = function rm(route) {
    var r = this.router.unmount(route);

    if (r && this.routes[r]) {
        delete this.routes[r];
    }

    return (r);
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)