express js условный оператор app.get () - PullRequest
0 голосов
/ 09 июля 2020
app.get('/api/notes/:id', (req, res, next) => {
  fs.readFile(dataPath, 'utf-8', (err, data) => {
    if (err) {
      throw err;
    }
    const wholeData = JSON.parse(data);
    const objects = wholeData.notes;
    const inputId = parseInt(req.params.id);

    if (inputId <= 0) {
      res.status(400).json({error: 'id must be a postive integer'});
    } else {
      for (const key in objects) {
        if (parseInt(objects[key].id) === inputId) {
          res.status(200).json(objects[key])
        } if (parseInt(objects[key].id) !== inputId) {
          res.status(404).json({error: `bruh theres no id ${inputId}`})
        }
      }
    } 
    
  })
  
})

это мой код, который я назначил в глобальном:

const dataPath = 'data.json';

и это то, что data. json файл выглядит как

{
  "nextId": 5,
  "notes": {
    "1": {
      "id": 1,
      "content": "The event loop is how a JavaScript runtime pushes asynchronous callbacks onto the stack once the stack is cleared."
    },
    "2": {
      "id": 2,
      "content": "Prototypal inheritance is how JavaScript objects delegate behavior."
    },
    "3": {
      "id": 3,
      "content": "In JavaScript, the value of `this` is determined when a function is called; not when it is defined."
    },
    "4": {
      "id": 4,
      "content": "A closure is formed when a function retains access to variables in its lexical scope."
    }
  }
}

если я набираю в командной строке http -v get: 3000 / api / notes / 3, оператор сообщения об ошибке выполняется, когда предполагается выполнение объекта с идентификатором 3

, однако, когда я удаляю сообщение об ошибке, если заявление. код может получить объект из файла json, как я могу это исправить?

1 Ответ

1 голос
/ 09 июля 2020

Полученная ошибка

_http_outgoing. js: 470 throw new ERR_HTTP_HEADERS_SENT ('set'); ^ Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту

из-за того, что вы используете res.json() внутри for...in l oop. Первая итерация сломает все остальное, потому что она отправит ответ .

Объект res представляет HTTP-ответ, который приложение Express отправляет, когда получает HTTP-запрос.

вы должны манипулировать данными (объектом / массивом / коллекцией), а затем отправлять их один раз за пределы for...in l oop.

примерно так:

app.get('/api/notes/:id', (req, res, next) => {
  fs.readFile(dataPath, 'utf-8', (err, data) => {
    if (err) {
      throw err;
    }
    const wholeData = JSON.parse(data);
    const objects = wholeData.notes;
    const inputId = parseInt(req.params.id);

    if (inputId <= 0) {
      res.status(400).json({error: 'id must be a postive integer'});
    } else {
      let obj= false;
      for (const key in objects) {
        if (parseInt(objects[key].id) === inputId) {
          obj = objects[key];
        }
      }
      if (obj) {
        res.status(200).json(obj)
      } else 
        res.status(404).json({error: `bruh theres no id ${inputId}`})
      }
    }
  });
  
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...