2015-06-15 16 views
10

Contextđộng rơi của xử lý trong restify

Tôi cố gắng để xây dựng một máy chủ năng động với restify (2.6.2), nơi dịch vụ được cài đặt và gỡ bỏ cài đặt một khi máy chủ được bắt đầu. Tôi nhận ra điều này có thể được xem như là một cái gì đó kỳ lạ nhưng nó có ý nghĩa trong bối cảnh của một dự án định hướng DSL. Để đạt được mục tiêu này, tôi đã triển khai các chức năng sau:

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] 
} 

Chức năng cài đặt, cài đặt trình xử lý theo lộ trình được chỉ định bởi đường dẫn và tên phương thức [1]. Hàm gỡ cài đặt, gỡ cài đặt trình xử lý bằng cách thả nó từ các tuyến [2]. khả năng này được tiếp xúc như các dịch vụ của đoạn mã sau:

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); 
}); 

Trong bài phương pháp [3], một handler được lấy từ cơ thể (đó là off-topic thế nào điều này được thực hiện) và một dịch vụ được cài đặt lưu trữ trở lại id trong cơ sở dữ liệu. Phương thức del [4], lấy id từ cơ sở dữ liệu và gọi hàm gỡ cài đặt.

Vấn đề

Mã này đã được thử nghiệm đơn vị và nó hoạt động bình thường nhưng một sự cố đạt được khi tôi cố gắng thực hiện một chuỗi uninstall cài đặt/như một sau. Trong ví dụ này, hãy giả sử rằng cơ thể của tất cả các yêu cầu chứa cùng path, http verb và nội dung thích hợp để xây dựng một chính xác handler:

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

Trong lần đầu tiên cài đặt, handler được thực hiện khi tài nguyên được tham gia qua pathverb. Yêu cầu gỡ cài đặt được thực hiện chính xác vì thông báo Resource not found được lấy khi path được truy cập trên verb. Tuy nhiên, khi cùng một cơ thể được cài đặt thứ hai trong máy chủ, một số Resource not found được trả lại khi path được tham gia trên verb.

Tôi cho rằng lỗi ở [2] vì, có thể, tôi không sử dụng chiến lược hủy đăng ký chính xác cho restify.

Câu hỏi

Làm thế nào có thể được giảm một cách hiệu quả xử lý từ restify khi máy chủ được bắt đầu?

+0

Ngoài ra, điều này không phải là điều cực kỳ nguy hiểm từ quan điểm bảo mật? Bạn cho phép mã tùy ý được truyền vào trong đó sẽ được thực hiện khi một điểm cuối nào đó được nhấn, cũng được truyền vào. – HeadCode

Trả lời

4

Sau khi xem xét nguồn khôi phục, tôi đã tìm thấy thông tin sau, mà bạn có thể muốn thử thay vì chỉ đơn giản là 'xóa' (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); 
}; 
Các vấn đề liên quan