Узел express найти данные в фильтре - PullRequest
0 голосов
/ 20 января 2020

Я следую некоторому руководству, но есть проблема с поиском значения в массиве. Вот как мой код выглядит

const express = require('express');
const app = express();

const courses = [
  {id: '1', name: 'ITCS1'},
  {id: '2', name: 'ITCS2'},
  {id: '3', name: 'ITCS3'},
];

app.get('/api/courses/:id', (req, res) => {
  const course = courses.find(c => c.id === parseInt(req.params.id));
  if (!course) res.status(404).send('Course not found for given id');
});

const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on port ${port}`));

, когда я загружаю этот URL http://localhost:5000/api/courses/1 its giving me course not found for given id

Но ожидаемый результат - {id: '1', name: 'ITCS1'}, поскольку идентификатор 1 находится в массиве курсов. Так почему он показывает ошибку, потому что id совпадает с массивом?

Ответы [ 6 ]

1 голос
/ 20 января 2020

Это работа с этим кодом:


const express = require('express');
const app = express();

const courses = [
  {id: '1', name: 'ITCS1'},
  {id: '2', name: 'ITCS2'},
  {id: '3', name: 'ITCS3'},
];

app.get('/api/courses/:id', (req, res) => {
  const course = courses.find(c => c.id === req.params.id);
  if (!course) res.status(404).send('Course not found for given id');
});

const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on port ${port}`));

Причина, по которой вы получаете ошибку, потому что вы используете parseInt.

И в ваших course, ваш идентификатор - это строка, а не целое число . Таким образом, вам не следует использовать parseInt.

Если вы хотите использовать parseInt, обновите массив курсов, делает ваш идентификатор целым числом , а не строкой.

Пример:

const courses = [
  {id: 1, name: 'ITCS1'},
  {id: 2, name: 'ITCS2'},
  {id: 3, name: 'ITCS3'},
];

Теперь вы можете использовать parseInt (req.params.id), и он будет работать нормально.

Надеюсь, это могу вам помочь.

0 голосов
/ 20 января 2020

Это потому, что вы используете строго равное, и у вас courses есть id в виде строки.

Вы можете изменить courses объект на:

const courses = [
  {id: 1, name: 'ITCS1'},
  {id: 2, name: 'ITCS2'},
  {id: 3, name: 'ITCS3'},
];

или используйте двойное равенство:

const course = courses.find(c => c.id == req.params.id);

или проанализируйте оба:

const course = courses.find(c => parseInt(c.id) === parseInt(req.params.id))

Но я предлагаю изменить тип данных courses.id и использовать строго равное. Но это только на мой взгляд. Вы можете узнать больше о строгом и свободном равенстве здесь

0 голосов
/ 20 января 2020

Это потому, что c.id - это string, но вы конвертируете параметр id в int с помощью parseInt(req.params.id). '1'===1 - это false. Используйте это:

app.get('/api/courses/:id', (req, res) => {
  const course = courses.find(c => c.id === req.params.id);
  if (!course) res.status(404).send('Course not found for given id');
});

=== оператор возвращает true, только если операнды имеют одинаковое значение и тип. Использование оператора == будет работать в вашем случае, но это не рекомендуется, так как это может привести к ложным срабатываниям.

0 голосов
/ 20 января 2020

Это потому, что вы строго сравниваете строку и целое число. Вы можете использовать два знака равенства или изменить типы данных для соответствия.

0 голосов
/ 20 января 2020

У вас есть тип string поля id. И вы сопоставляете его с полем типа int. Сделайте оба поля types или сделайте их обоих int или stirng.

courses.find(c => c.id === req.params.id.toString())

Или

courses.find(c => parseInt(c.id) === parseInt(req.params.id))
0 голосов
/ 20 января 2020

Применить parseInt для обеих сторон

courses.find(c => parseInt(c.id) === parseInt(req.params.id))

или использовать == не ===

courses.find(c => c.id == req.params.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...