Подтвердить что ты не робот

Динамическое отбрасывание обработчиков в обновлении

Контекст

Я пытаюсь создать динамический сервер с restify (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]. Функция удаления, удалите обработчик, сбросив его с маршрутов [2]. Эти возможности отображаются как службы по следующему коду:

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

В методе post [3] обработчик получается из тела (вне темы, как это делается), и устанавливается служба, хранящая возвращенный идентификатор в базе данных. Метод del [4], извлекает идентификатор из базы данных и вызывает функцию удаления.

Проблема

Этот код был протестирован с помощью модуля, и он работает правильно, но при попытке выполнить последовательность установки и удаления, как и следующая, происходит сбой. В этом примере, пожалуйста, предположите, что тело всех запросов содержит те же path, http verb и правильный контент для создания правильного handler:

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

В первой установке handler выполняется, когда ресурс присоединяется через path и verb. Запрос на удаление корректно выполняется, потому что сообщение Resource not found получается, когда path посещается на verb. Тем не менее, когда одно и то же тело установлено на сервере вторым, возвращается Resource not found, когда path присоединяется к verb.

Я предполагаю, что ошибка в [2], потому что, может быть, я не использую правильную стратегию отмены регистрации для restify.

Вопрос

Как можно эффективно удалить обработчики из restify после запуска сервера?

4b9b3361

Ответ 1

После просмотра исходного источника я обнаружил следующее, которое вы можете попробовать вместо простого удаления (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);
};