Проблема сводится к чувствительности к регистру.
Когда вы смотрите на документацию для req.get
(с псевдонимом req.header
), она гласит:
Возвращает указанное поле заголовка HTTP-запроса (совпадение без учета регистра). Поля Referrer и Referer являются взаимозаменяемыми.
Стандарт w3 указывает, что заголовки должны быть без учета регистра:
Каждое поле заголовка состоит из имя, за которым следует двоеточие (":") и значение поля. Имена полей не чувствительны к регистру.
Таким образом, может показаться, что модуль http узла, который используется express, просто обрабатывает их все как строчные буквы, чтобы "сохранить ваши шаги" в соответствии с этим GitHub Issue
Вы можете видеть , что express
framework req
объект фактически использует модуль узла http
:
var accepts = require('accepts');
var deprecate = require('depd')('express');
var isIP = require('net').isIP;
var typeis = require('type-is');
var http = require('http');
var fresh = require('fresh');
var parseRange = require('range-parser');
var parse = require('parseurl');
Более того в коде вы можете видеть, что метод req.header
преобразует все, что вы даете ему, в нижний регистр:
req.get =
req.header = function header(name) {
if (!name) {
throw new TypeError('name argument is required to req.get');
}
if (typeof name !== 'string') {
throw new TypeError('name must be a string to req.get');
}
var lc = name.toLowerCase();
switch (lc) {
case 'referer':
case 'referrer':
return this.headers.referrer
|| this.headers.referer;
default:
return this.headers[lc];
}
};
Наконец, модуль http
анализирует заголовки, используя matchKnownFields
* Функция 1040 *, которая автоматически в нижнем регистре записывает все заголовки, которые не являются "традиционными заголовками", в этом случае она нечувствительна к регистру.
Вот ответственный фрагмент, который реализует поведение, которое вы видите:
if (lowercased) {
return '\u0000' + field;
} else {
return matchKnownFields(field.toLowerCase(), true);
}