req.url
в вашем случае будет /?file=index.js
. И, url2.file
равно undefined
, поэтому, когда вы делаете это:
if(fs.existsSync(url2.file)==true)
вы работаете:
if(fs.existsSync(undefined)==true)
, что никогда не будет правдой.
Если вам нужен конкретный c параметр запроса, такой как file=index.js
, то вам нужно проанализировать этот URL в структуре данных, которая затем позволит вам получить доступ к свойству .file
.
Существует несколько способов анализа строки запроса.
Вы можете использовать библиотеку URL-адресов и проанализировать весь URL-адрес, а затем он даст вам то, что он вызывает URLSearchParams.
Вы можете получить только строку запроса самостоятельно и использовать библиотеку queryString для анализа только строки запроса в ее части.
Вы можете использовать такую среду, как Express, которая автоматически анализирует параметры строки запроса и помещает их в req.query
.
Вот реализация с использованием модуля queryString :
const http = require("http");
const fs = require("fs");
const querystring = require('querystring');
http.createServer(function(req,res) {
let index = req.url.indexOf("?");
if (index !== -1) {
let qs = req.url.slice(index + 1);
let qsObj = querystring.parse(qs);
if (qsObj.file) {
if (fs.existsSync(qsObj.file)) {
res.end(`The file ${qsObj.file} exists`);
} else {
res.end(`The file ${qsObj.file} does not exist`);
}
return;
}
}
res.end("Invalid request, no file specified");
}).listen(8080);
Или вот реализация с использованием класса URL:
const http = require("http");
const fs = require("fs");
http.createServer(function(req,res) {
urlObj = new URL(req.url, `http://${req.headers.host}`);
let file = urlObj.searchParams.get("file");
if (file) {
if (fs.existsSync(file)) {
res.end(`The file ${file} exists`);
} else {
res.end(`The file ${file} does not exist`);
}
return;
}
res.end("Invalid requeset, no file specified");
}).listen(8080);