evgeniy8705
@evgeniy8705
Повелитель вселенной

Насколько правильно выполнено задание, что стоило бы исправить?

Было задание обработать запросы "GET", "POST", "DELETE".
Написал. Вроде как даже и работает все. Но явно же что тут 100500 недочетов.
Подскажите пожалуйста, что стоило бы дописать/исправить в коде?

curl http://localhost:8080/page/index.html

curl -X DELETE http://localhost:8080/page/index.html

curl -d "Hello world" http://localhost:8080/page/index.html


// app.js

let http = require("http");
let fs = require("fs");
let handler = require("./handler");

new http.createServer(handler).listen(8080);


// handler.js

let url = require("url");
let fs = require("fs");
let config = require("config");
let path = require("path");

module.exports = (req, res) => {
  let urlParsed = url.parse(req.url);
  let pathname = urlParsed.pathname;
  let filePath = path.join(config.publicRoot, pathname);

  if (!filePath.startsWith(config.publicRoot + path.sep)) {
    res.statusCode = 400;

    res.end("Bye bye silly hacker!");
  }

  fs.readFile(filePath, (err, content) => {
    if (err) {
      if (err.code == "ENOENT") {
        res.statusCode = 404;

        res.end("404");
      } else {
        res.statusCode = 500;

        res.end("Server Error")
      }
    }

    if (req.method == "GET") {
      let file = new fs.ReadStream(filePath);

      file.pipe(res);

      file.on("error", err => {
        res.statusCode = 500;
        res.end("Server error");

        console.error(err);
      });

      res.on("close", () => {
        file.destroy();
      });
    }

    if (req.method == "POST") {
      let file = new fs.createWriteStream(filePath);

      req.pipe(file);

      res.end();
    }

    if (req.method == "DELETE") {
      try {
        fs.unlink(filePath, err => {
          if (err) {
            throw err;
          }

          res.statusCode = 200;

          res.end("File was removed");
        });
      } catch (err) {
        if (err.code == "ENOENT") {
          res.statusCode = 404;

          res.end("File not found");
        } else {
          res.statusCode = 500;

          res.end("Error on removing file");
        }
      }
    }
  });
};

// config.js

let path = require("path");

module.exports = {
  projectRoot: process.cwd(),
  publicRoot: process.cwd() + path.sep + "public"
};
  • Вопрос задан
  • 267 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ну для начала разбить по файлам, чтобы в каждом осталось по одному хэндлеру и добавить простенький роутер, который это делает.
Следующий шаг - сделать обработку запроса как цепочку middleware, вообще по вашей формулировке задания совершенно непонятно что именно от вас хотели. На какую это вакансию хотя бы?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы