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 path
và verb
. 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?
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