@evg_96

Как обработать запросы с методами GET, POST, DELETE?

После видео урока дали дз написать обработку запросов.
Если запрос с методом 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);

  • Вопрос задан
  • 637 просмотров
Пригласить эксперта
Ответы на вопрос 1
@RidgeA
непонятно в чем, собственно, проблема.

Как работать с ФС есть тут - https://nodejs.org/api/fs.html
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы