2015-06-15 5 views
10

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

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

В посте методе [3], обработчик получается из тела (это не по теме, как это осуществляется) и служба устанавливается хранение возвращаемого id в базе данных. Метод 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 после запуска сервера?

+0

В стороне, разве это не невероятно рискованно с точки зрения безопасности? Вы разрешаете передавать произвольный код, который будет выполняться при ударе определенной конечной точки, которая также передается. – HeadCode

ответ

4

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