Контекст
Я пытаюсь создать динамический сервер с 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
после запуска сервера?