Как решить проблему поиска товара по идентификатору? - PullRequest
0 голосов
/ 13 ноября 2018

Когда я следую по маршруту: '/ gallery', я получаю все элементы из файла './posts.json' и отображаю их на экране. Но когда я поворачиваю маршрут: '/ gallery /: id', я хочу получить один элемент по его id.

Но я получаю ошибку: const pictureId = this.formatePicture.findIndex(p => p.id == parseInt(id)); TypeError: this.formatePicture.findIndex is not a function. Я пытался сделать for in на data, но после цикла свойства объекта отсутствуют.

Скажите мне, что я делаю неправильно и как решить эту проблему, чтобы я получил элемент по id, когда иду по маршруту '/ gallery /: id'

app.js:

const express = require('express');
const Database = require('./db');

const app = express();
const port = 3000;
const db = new Database();

app.use(express.json());

app.get('/gallery', (req, res) => {
    if (req.query.id) {
        const picture = db.read(req.query.id);
        picture.then(data => {
            res.send(data);
        })
    } else {
        const pictures = db.read();
        pictures.then(data => {
            res.send(data);
        })
    }
});

app.get('/gallery/:id', (req, res) => {
    const picture = db.read(req.params.id);
    if (!picture) {
        res.status(404);
        res.send();
    } else {
        picture.then(data => {
            res.send(data);
        })
    }
});

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`)
});

db.js:

const fs = require('fs');
class Database {
constructor() {
     this.formatePicture = [];
}
    read (id) {
        return new Promise((resolve, reject) => {
            fs.readFile('./posts.json', 'utf-8', (err, data) => {
                if (err) {
                    reject(err)
                }else if(id) {
                    this.formatePicture = JSON.parse(data);
                    const pictureId = this.formatePicture.findIndex(p => p.id == parseInt(id));
                    resolve(pictureId)
                }
                else {
                    resolve(data)
                }
            })
        })
    }
}

module.exports = Database;

posts.json:

{
  "posts": [
    {
      "id": 1,
      "date": "2018-10-22T14:10:37.578Z",
      "title": "accusamus beatae ad facilis cum similique qui sunt",
      "url": "https://i.pinimg.com/originals/90/39/16/903916b9f0db6992f1a4b66ae3129fbe.jpg"
    },
    {
      "id": 2,
      "date": "2018-10-22T14:10:37.578Z",
      "title": "reprehenderit est deserunt velit ipsam",
      "url": "https://vignette.wikia.nocookie.net/okup/images/d/da/C683c20a5b0ae062b2325653f2fd3bdf.jpg/revision/latest?cb=20170131193210&path-prefix=da"
    }
      ]
}

1 Ответ

0 голосов
/ 13 ноября 2018

Анализируемые данные - это объект, массив, который вам нужен, находится в поле posts

this.formatePicture.posts.findIndex(...)

Еще один способ добиться этого без изменения кода БД - изменить структуру в posts.json так, чтобы она выглядела следующим образом

[
    {
      "id": 1,
      "date": "2018-10-22T14:10:37.578Z",
      "title": "accusamus beatae ad facilis cum similique qui sunt",
      "url": "https://i.pinimg.com/originals/90/39/16/903916b9f0db6992f1a4b66ae3129fbe.jpg"
    },
    {
      "id": 2,
      "date": "2018-10-22T14:10:37.578Z",
      "title": "reprehenderit est deserunt velit ipsam",
      "url": "https://vignette.wikia.nocookie.net/okup/images/d/da/C683c20a5b0ae062b2325653f2fd3bdf.jpg/revision/latest?cb=20170131193210&path-prefix=da"
    }
]

В качестве примечания:

Возможно, вы захотите использовать find вместо findIndex, потому что pictureId - это индекс с исходным кодом, которым вы поделились

Это может выглядеть так

const picture = this.formatePicture.find(p => p.id == parseInt(id));

// checking if we found an entry first
if (picture) {
    resolve(picture.id);
} else {
    reject(/* some error about resource not being found */)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...