2013-03-22 33 views
7

Tôi đã viết một phần mềm trung gian cho Connect và Express đòi hỏi một số nâng nặng trong phương pháp thiết lập của nó. Do tính chất của các tác vụ khởi tạo, công cụ này không đồng bộ nên tôi có vấn đề là phần mềm trung gian chỉ có thể truy cập được khi khởi tạo đã được chạy.Cách sử dụng khởi tạo không đồng bộ trong phần mềm kết nối trung gian?

Hiện nay tôi đã giải quyết nó bằng cách sử dụng callback:

function setupMiddleware(callback) { 
    doSomeAsyncInitialization(function() { 
    callback(function (req, res, next) { 
     // The actual middleware goes here ... 
    }); 
    }); 
} 

này hoạt động, nhưng nó không phải là tốt đẹp cho người gọi. Thay vì có thể làm

app.use(setupMiddleware()); 

tôi phải làm:

setupMiddleware(functin (middleware) { 
    app.use(middleware); 
}); 

Bây giờ tôi đã suy nghĩ liệu có một cách tiếp cận tốt hơn, ví dụ để cho phần mềm trung gian khởi tạo trong nền và trì hoãn tất cả các yêu cầu đến cho đến khi phần mềm trung gian sẵn sàng.

Tôi làm cách nào để giải quyết vấn đề này? Bất kỳ ý tưởng hay thực hành tốt nhất mà tôi nên sử dụng ở đây?

Trả lời

2

bây giờ tôi giải quyết nó sử dụng một biến isInitialized và trì hoãn chức năng trung gian của chính nó. Xem ví dụ sau:

var connect = require('connect'); 

var setup = function() { 
    var isInitialized = false; 

    setTimeout(function() { 
    isInitialized = true; 
    }, 10000); 

    function run (req, res, next) { 
    res.write('Foo'); 
    res.end(); 
    } 

    function delay (req, res, next) { 
    if (isInitialized) { 
     return run(req, res, next); 
    } 

    setTimeout(function() { 
     delay(req, res, next); 
    }, 1000); 
    } 

    return function (req, res, next) { 
    if (req.url === '/foo') { 
     delay(req, res, next); 
     return; 
    } 
    next(); 
    } 
}; 

var app = connect(); 
app.use(setup()); 
app.use(function (req, res) { 
    res.write('Fertig!'); 
    res.end(); 
}); 

var http = require('http'); 

http.createServer(app).listen(5000); 

Xin lưu ý rằng mã này chưa được chứng minh là chính ý tưởng đó hoạt động.

0

Tại sao bạn không làm như như sau,

doSomeAsyncInitialization(function() { 
    //After doing all long running init process just configure your express as follows. 
    app.use(<middlewares>); 
    app.listen(<portnumder>); 

}); 
+1

Do khởi tạo chỉ dành cho một phần mềm trung gian, không phải cho toàn bộ ứng dụng. Và kiểu mẫu này hoạt động, nhưng nó không "đẹp". Tôi không thích rằng tất cả mọi thứ được thụt vào một bước (và đây không chỉ là một vấn đề định dạng ;-)). –

+0

Tôi chấp nhận nó. Vì Nodejs không bị chặn, bạn phải nhận mã trong quá trình gọi lại quy trình chạy dài hoặc theo cách hiển thị trong câu hỏi của bạn. Ofcource, bạn có thể sử dụng một số mô-đun không đồng bộ. Ở đây tôi giả định middleware của bạn là bắt buộc đối với tất cả các yêu cầu, do đó bạn giữ trong hàm app.use(). Và gợi ý của tôi là, bạn chỉ cần khởi tạo phần mềm trung gian trước khi bắt đầu nghe cổng. Nếu bạn đang mong đợi nhiều hơn định dạng, tôi phải hiểu những gì đang xảy ra "doSomeAsyncInitialization" chức năng. –

+0

Vâng, như đã nói, một ý tưởng có thể là chức năng thiết lập ngay lập tức trả về phần mềm trung gian, nhưng phần mềm trung gian sẽ trì hoãn các yêu cầu đến cho đến khi nó được khởi tạo hoàn toàn. –

Các vấn đề liên quan