2015-10-31 17 views
22

Có một số câu hỏi tương tự được hỏi nhưng câu hỏi của tôi là nếu tôi muốn phổ biến kết quả trung gian mà tôi nhận được cùng với phần mềm trung gian định tuyến khác nhau, cách tốt nhất để làm điều đó là gì?req.locals so với res.locals so với res.data so với req.data so với app.locals trong phần trung gian Express

app.use(f1); app.use(f2); app.use(f3); 

function f1(req,res,next) { 
    //some database queries are executed and I get results, say x1 
    res.locals.dbResults = {...}; 
    next(); 
} 

function f2(req,res,next) { 
    // more processing based upon req.locals.dbResults 
    res.locals.moreResults = {....}; 
    next(); 
} 
// ... 

Tôi nghĩ rằng tôi có thể nhận công tác tuyên truyền cùng một dữ liệu thông qua các trung gian khác nhau bằng cách sử dụng req .locals. Ngoài ra, có vẻ như các đối tượng yêu cầu và đáp ứng đều có các thuộc tính cục bộ được khởi tạo cho một đối tượng rỗng khi bắt đầu yêu cầu.

Ngoài ra, bạn cũng có thể đặt thuộc tính res.mydata hoặc req.mydata? Về lý thuyết, app.locals cũng có thể được sử dụng để truyền dữ liệu này cùng với các phần mềm trung gian khác vì nó sẽ tồn tại trên các phần tử trung gian nhưng điều đó sẽ trái ngược với việc sử dụng thông thường của app.locals. Nó được sử dụng nhiều hơn cho dữ liệu ứng dụng cụ thể. Cũng cần phải xóa dữ liệu đó ở cuối chu kỳ yêu cầu-đáp ứng để các biến tương tự có thể được sử dụng cho yêu cầu tiếp theo.

Cách tối ưu và tiêu chuẩn để truyền bá kết quả trung gian thông qua phần mềm trung gian là gì?

Trả lời

57

Như bạn đã đề cập, cả hai req.locals, res.locals hoặc thậm chí khóa được xác định của riêng bạn res.userData có thể được sử dụng. Ngoài việc đặt tên, không có sự khác biệt thực sự. Điều đó đang được nói, tôi sẽ tuy nhiên khuyên bạn nên sử dụng res.locals vì đây là người duy nhất được đề cập trong tài liệu chính thức Express.js:

res.locals Một đối tượng có chứa phản ứng biến địa phương scoped đến yêu cầu, và do đó chỉ có sẵn cho (các) chế độ xem được hiển thị trong chu kỳ yêu cầu/phản hồi đó (nếu có). Nếu không, thuộc tính này giống hệt với app.locals.

Thuộc tính này hữu ích khi hiển thị thông tin cấp yêu cầu chẳng hạn như tên đường dẫn yêu cầu, người dùng được xác thực, cài đặt người dùng, v.v.

Nguồn: http://expressjs.com/en/api.html#res.locals

Bởi vì nó chính thức thành văn bản, có ít cơ hội của res.locals sở hữu bao giờ được sử dụng cho bất cứ điều gì khác (khả năng tương thích ngược). Nếu bạn chọn khóa riêng của mình, luôn có khả năng các phiên bản tương lai của Express.js sẽ ghi đè dữ liệu của bạn vì chúng xảy ra để sử dụng cùng một khóa. Điều này sẽ không xảy ra khi sử dụng res.locals. Nó cũng giúp người mới hiểu mã của bạn dễ dàng hơn vì hầu hết các dự án đều sử dụng res.locals để lưu trữ dữ liệu phần mềm trung gian.

+0

Cảm ơn bạn đã làm rõ về sự phân biệt tài liệu hoạt động có lợi cho res.locals. Bạn xác nhận sự hiểu biết của tôi rằng trong lý thuyết tất cả các phương pháp tiếp cận là về mặt kỹ thuật giống nhau. Hãy chờ thêm nhận xét. Upvoted câu trả lời của bạn ... chắc chắn hữu ích. – Sam

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