После видео урока дали дз написать обработку запросов.
Если запрос с методом GET, то из папки ./files отдать файл (
http://site.com/название файла)
Если POST (
http://site.com/название файла), то проверить, если файла нет в ./files, то создать файл и записать в него данные переданные при запросе.
Если DELETE, то проверить, если файл есть в ./files, то удалить его.
Пробую уже час написать решение данного задания, но что то не выходит.
Написал вот заготовку...
const http = require("http");
const fs = require("fs");
const url = require("url");
const handlerGET = require("./handlerGET");
const handlerPOST = require("./handlerPOST");
const handlerDELETE = require("./handlerDELETE");
http.createServer((req, res) => {
const pathname = decodeURI(url.parse(req.url).pathname);
switch (req.method) {
case "GET": {
handlerGET(pathname, req, res); break;
}
case "POST": {
handlerPOST(pathname, req, res); break;
}
case "DELETE": {
handlerDELETE(pathname, req, res); break;
}
default: {
res.statusCode = 502;
res.end("Not implemented");
}
}
}).listen(3000);
const handlerGET = (pathname, req, res) => {
if (pathname === "/") {
require("fs").createReadStream(__dirname + "/index.html").pipe(res);
} else {
// Проверить если файл есть в директории ./files, то отдать пользователю
}
};
module.exports = handlerGET;
const handlerPOST = (pathname, req, res) => {
// Проверить если файла нет в директории ./files, то создать файл и записать в него тело запроса, иначе отправить 409.
// Также проверить размер файла, если больше 1мб то вернуть ошибку 413.
};
module.exports = handlerPOST;
const handlerDELETE = (pathname, req, res) => {
// Удалить файл ./files/pathname, вернуть 200, иначе 404.
};
module.exports = handlerDELETE;
Подскажите как обработать данные запросы по условию задачи? Или подскажите статью какую нибудь, где описан подобные функционал
Вроде как готовое решениеconst http = require("http");
const fs = require("fs");
const url = require("url");
const public = __dirname + "/files";
http.createServer((req, res) => {
const pathname = url.parse(req.url).pathname;
if (pathname === "/") {
res.writeHead(200, {
"Content-Type": "text/html"
});
fs.createReadStream(__dirname + "/index.html").pipe(res);
}
switch (req.method) {
case "GET": {
const file = fs.createReadStream(public + pathname);
file.on("error", err => {
if (err.code === "ENOENT") {
res.statusCode = 404;
res.end("File not found");
} else {
res.statusCode = 500;
res.end("Server error");
}
});
file.on("open", () => {
res.writeHead(200, {
"Content-Type": "text/html" // ???
});
});
res.on("close", () => {
file.destroy();
});
file.pipe(res);
break;
}
case "POST": {
const file = fs.createWriteStream(public + pathname, {
flags: "wx"
});
const maxSize = 1024 * 1024;
let size = 0;
file.on("error", err => {
if (err.code === "EEXIST") {
res.statusCode = 409;
res.end("File already exists");
} else {
if (!res.headersSent) {
res.statusCode = 500;
res.setHeader("Connection", "close");
res.write("Internal error");
}
fs.unlink(pathname, err => {
res.end();
});
}
});
file.on("close", () => {
res.statusCode = 200;
res.end("OK");
});
req.on("data", chunk => {
size += chunk.length;
if (size > maxSize) {
res.statusCode = 413;
res.setHeader("Connection", "close");
res.end("Your data too big for my little server");
file.destroy();
file.unlink(err => {
if (err) {
throw err;
}
});
}
});
req.pipe(file);
break;
}
case "DELETE": {
fs.unlink(public + pathname, err => {
if (err) {
res.statusCode = 500;
res.end("Server error");
} else {
res.statusCode = 200;
res.end("File was deleted");
}
});
break;
}
default: {
res.statusCode = 502;
res.end("Not implemented");
}
}
}).listen(3000);