上下文
我正在尝试用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); };