#javascript #node.js
#javascript #node.js
Вопрос:
Я пытаюсь проверить, установлен ли исходный заголовок в запросе клиента. На данный момент я пытаюсь сделать первый оператор if, но он не работает. Как это можно исправить?
const http = require('http');
const port = 3000;
http.createServer((req, res) => {
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, HEAD',
'Access-Control-Max-Age': '7200'
};
if (req.headers['ORIGIN'] === null) {
res.statusCode = 400;
res.end("Origin header not in the request")
}
if (req.method === 'HEAD') {
res.writeHead(200, headers);
res.end();
}
if (req.method === 'GET') {
res.writeHead(200, headers);
res.end("I was requested using CORS!");
}
if (req.method === 'POST') {
res.writeHead(200, req.headers);
res.end("I was requested using CORS!");
}
if (req.method =! 'GET' amp;amp; req.method != 'POST' amp;amp; req.method != 'HEAD'){
res.writeHead(405, headers);
res.end("Request used a HTTP method which is not allowed.");
}
}).listen(port);
Комментарии:
1.
if (req.method =! 'GET' amp;amp; req.method != 'POST' amp;amp; req.method != 'HEAD'){
собирается заблокировать запрос параметров перед запуском, что делает настройкуAccess-Control-Allow-Methods
бессмысленной.
Ответ №1:
Заголовки, которые не существуют, будут undefined
, а не null
.
Однако это не очень полезная проверка. Это просто останавливает людей, посещающих URL-адрес непосредственно в браузере, или от выполнения запроса того же источника с помощью JS. Это не помешает им использовать другие инструменты для выполнения HTTP-запросов.
Ответ №2:
Заголовки HTTP не чувствительны к регистру. Из RFC 2616, раздел 4.2:
Каждое поле заголовка состоит из имени, за которым следует двоеточие («:»), и значения поля. Имена полей не чувствительны к регистру.
По этой причине HTTP-модуль NodeJS преобразует все имена заголовков в нижний регистр. При этом вы можете получить доступ к необработанным именам заголовков через req.rawHeaders.
Чтобы заставить ваш код работать, я бы проверил наличие origin
заголовка в нижнем регистре, и я бы также проверил, является ли его значение undefined
, а не null
потому, что, если заголовок не существует в запросе, его значение будет undefined
.