Cách trích xuất các tiêu đề http yêu cầu từ một yêu cầu bằng kết nối NodeJS


265

Tôi muốn nhận tiêu đề "Máy chủ" của yêu cầu được thực hiện bằng gói thư viện kết nối của Node JS. Mã của tôi trông như:

var app = connect()
  .use(connect.logger('dev'))
  .use(connect.static('public'))
  .use(function(req, res){

    var host = req.???

  })
 .listen(3000);

Tài liệu về kết nối có ở đây nhưng tôi không thấy bất cứ điều gì chi tiết về API của reqđối tượng trong đoạn mã trên. http://www.senchalabs.org/connect/

Chỉnh sửa : Lưu ý một câu trả lời thành công phải trỏ đến tài liệu (Tôi cần điều này để xác minh phiên bản nào cung cấp API tôi đang tìm).

Câu trả lời:


333

Nếu bạn sử dụng Express 4.x, bạn có thể sử dụng req.get(headerName)phương pháp như được mô tả trong Tham chiếu API Express 4.x


177
Cũng có bí danh với tên tốt hơn req.header(headerName).
ZachB

6
Không cần phải mang Express cho chức năng cơ bản như thế này. Thay vào đó hãy sử dụng nguyên bản trong NodeJS như được đề cập dưới đây. nodejs.org/en/docs/guides/anatomy-of-an-http-transaction
CodeFinity

199

Để xem danh sách các tiêu đề yêu cầu HTTP, bạn có thể sử dụng:

console.log(JSON.stringify(req.headers));

để trả về một danh sách ở định dạng JSON.

{
"host":"localhost:8081",
"connection":"keep-alive",
"cache-control":"max-age=0",
"accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"upgrade-insecure-requests":"1",
"user-agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36",
"accept-encoding":"gzip, deflate, sdch",
"accept-language":"en-US,en;q=0.8,et;q=0.6"
}

2
Tôi thấy điều này hữu ích hơn câu trả lời được chấp nhận ở trên. JSON.opesify làm cho tất cả sự khác biệt.
Patrick

1
Hoàn toàn - trên một ghi chú liên quan, bạn cũng có thể làm: require('util').inspect(req.headers, {depth: null}nếu bạn muốn tương đương với những gì bạn nhận được trong REPL Node. Dù bằng cách nào bạn kết thúc với một chuỗi.
mikermcneil

4
Tại sao không req.headerscó trong tài liệu Express chính thức? expressjs.com/en/api.html#req
user1063287

1
Nói rõ ràng ở đây:headerValue = req.headers['headerName'];
asokan

1
Họ chỉ ghi nhận những tài sản không có nguồn gốc. Có một lưu ý trong tài liệu Express được đề cập ở trên: "Đối tượng req là phiên bản nâng cao của đối tượng yêu cầu riêng của Node và hỗ trợ tất cả các trường và phương thức tích hợp ." có chứa một liên kết trỏ đến tài liệu Node của đối tượng cơ bản.
Serge N

141

Kiểm tra đầu ra của console.log(req)hoặcconsole.log(req.headers);


11
Làm thế nào bạn tìm ra về req.headers? Trường này có sẵn phiên bản nào?
Alex Spurling

11
@AlexSpurling nodejs.org/api/http.html#http_Vquest_headers . Kết nối chỉ mở rộng các loại từ mô-đun HTTP của Node - http.ServerRequesthttp.ServerResponse. Các thuộc tính hoặc sự kiện được tìm thấy trong tài liệu của Node cũng nên có sẵn với Connect (và, bằng cách mở rộng thêm, Express).
Jonathan Lonowski

1
Điều đó có ý nghĩa hơn. Một lần nữa, sẽ rất tốt nếu biết nơi tìm thông tin đó (rằng loại req thực sự là http.ServerRequest). Các tài liệu không xuất hiện để làm rõ điều này.
Alex Spurling

1
Loại req là http.In sắpMessage
Anatoliy

Ý chính này mô phỏng yêu cầu http và nó có thể hữu ích cho bạn: gist.github.com/3879071
Anatoliy

56
var host = req.headers['host']; 

Các tiêu đề được lưu trữ trong một đối tượng JavaScript, với các chuỗi tiêu đề là các khóa đối tượng.

Tương tự, tiêu đề tác nhân người dùng có thể được lấy bằng

var userAgent = req.headers['user-agent']; 

3
LƯU Ý: giá trị chỉ mục được đặt tên là FreakING !! trường hợp nhạy cảm
Steve

9
Theo nhận xét của @Steve về trường hợp nhạy cảm, tất cả các tiêu đề đều có giá trị thấp hơn. Vì vậy, nếu bạn đang đặt tiêu đề "Xuất xứ" (viết hoa 'O') thì phần tử duy nhất trong bộ sưu tập tiêu đề yêu cầu sẽ là "gốc" với chữ thường 'o'.
cướp
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.