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 mềm trung gian Express


82

Có một số câu hỏi tương tự được đặt ra nhưng câu hỏi của tôi là nếu tôi muốn truyền tải các 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, thì cách tốt nhất để làm điều đó là gì?

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 cùng một sự lan truyền dữ liệu thông qua phần mềm trung gian khác nhau bằng cách sử dụng req .locals. Ngoài ra, có vẻ như cả hai đối tượng request và response đều có các thuộc tính local được khởi tạo thành một đối tượng trống khi bắt đầu yêu cầu.

Ngoài ra, người ta 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 nhau vì nó sẽ tồn tại trên các phần mềm trung gian nhưng điều đó sẽ trái ngược với cách sử dụng app.locals thông thường. 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 đó vào cuối chu kỳ yêu cầu-phản hồi để 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 các kết quả trung gian thông qua phần mềm trung gian là gì?

Câu trả lời:


151

Như bạn đã đề cập, cả hai req.locals, res.localshoặc thậm chí khóa được xác định của riêng bạn res.userDatađều có thể được sử dụng. Tuy nhiên, khi sử dụng công cụ xem với Express, bạn có thể bật dữ liệu trung gian res.localstrong phần mềm trung gian của mình và dữ liệu đó sẽ có sẵn trong chế độ xem của bạn (xem bài đăng này ). Thực tế phổ biến là bật dữ liệu trung gian bên trong phần mềm trung gian req.localsđể tránh ghi đè dữ liệu xem trong res.locals, mặc dù điều này không được chính thức ghi lại.

res.locals Một đối tượng có chứa các biến cục bộ phản hồi trong phạm vi 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 để hiển thị thông tin cấp yêu cầu như tên đường dẫn yêu cầu, người dùng đã xác thực, cài đặt người dùng, v.v.

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


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

Lưu ý phụ: res.render()ưu tiên hơn res.locals. Vì vậy, ai đó có thể vô tình ghi đè biến như vậyres.locals = { name: 'Jake' } // later in code... res.render('user.template', { name: 'Tony' }, (err, html) => {}) // the 'name' variable is now 'Tony'
zenoh

Dù sao, quy hoạch tốt, sạch sẽ và mô-đun thiết kế middleware nên là giải pháp tốt hơn và lâu dài hơn là chỉ dựa vào một phím đối tượng duy nhất
zenoh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.