При попытке положить объект в моем массиве, эта функция фильтра не удаляет старый объект - PullRequest
1 голос
/ 03 апреля 2019

Репо: https://github.com/leongaban/api-design-node/tree/master

Моя коллекция Почтальон: https://www.getpostman.com/collections/b5a03b07836ad34b7758

Ожидаемый:

Текущий "символы льва:

[
    {
        "id": "1",
        "name": "Teemo",
        "pride": "LoL",
        "age": "1",
        "gender": "male"
    },
    {
        "id": "2",
        "name": "Nasus",
        "pride": "LoL",
        "age": "10",
        "gender": "male"
    }
]

PUT http://localhost:3000/lions/1

Тело:

{
    "age": "1",
    "gender": "female",
    "name": "LuLu",
    "pride": "LoL"
}

Должно вернуть этот новый список на GET всех львов:

[
    {
        "id": "1",
        "name": "LuLu",
        "pride": "LoL",
        "age": "1",
        "gender": "female"
    },
    {
        "id": "2",
        "name": "Nasus",
        "pride": "LoL",
        "age": "10",
        "gender": "male"
    }
]

Результаты

[
    {
        "id": "2",
        "name": "Nasus",
        "pride": "2",
        "age": "2",
        "gender": "female"
    },
    {
        "0": { // <-- This should not be here
            "id": "1",
            "name": "Teemo",
            "pride": "1",
            "age": "1",
            "gender": "female"
        },
        "age": "1",
        "gender": "female",
        "name": "LuLu",
        "pride": "LoL"
    }
]

Полный server.js

const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const path = require('path')
const port = 3000

app.use(express.static('client'))
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())

let lions = []
let id = 0

app.get('/lions', function(req, res) {
  console.log('GET lions:', lions)
  res.json(lions)
})

app.get('/lions/:id', function(req, res) {
  let lion = lions.filter((lion => lion.id === req.params.id))

  res.json(lion || {})
})

app.post('/lions', function(req, res) {
  id++
  const lion = Object.assign({ id: id.toString() }, req.body)
  lions.push(lion)

  res.json(lion)
});

app.put('/lions/:id', function(req, res) {
  const paramId = req.params.id
  const updated = req.body

  if (updated.id) {
    delete updated.id
  }

  const oldLion = lions.filter((lion => lion.id === paramId))

  if (!oldLion) {
    res.send()
  }

  const newLion = Object.assign(updated, oldLion)
  console.log('newLion', newLion)
  lions = lions.filter(lion => lion.id !== paramId)
  lions.push(newLion)

  res.json(newLion)
});

app.listen(port, () => console.log(`NODE RUNNING on port: ${port}`))

Функция PUT

app.put('/lions/:id', function(req, res) {
  const paramId = req.params.id
  const updated = req.body

  if (updated.id) {
    delete updated.id
  }

  // Here I find the oldLion to replace by id:
  const oldLion = lions.filter((lion => lion.id === paramId))

  if (!oldLion) {
    res.send()
  }

  // Here I create a new object for the new "lion":
  const newLion = Object.assign(updated, oldLion)
  console.log('newLion', newLion)

  // Here I filter out the old lion:
  lions = lions.filter(lion => lion.id !== paramId)

  // New lion is pushed in:
  lions.push(newLion)

  res.json(newLion)
});

1 Ответ

2 голосов
/ 03 апреля 2019

Одна потенциальная проблема, которая может возникнуть в методе app.put(), заключается в том, что когда вы выполните const oldLion = lions.filter((lion => lion.id === paramId)), вы получите array в качестве результата.Проверьте Array.filter () для получения дополнительной информации об этом.Итак, я считаю, что вы хотите использовать Array.find () вместо filter(), потому что позже вы звоните:

const newLion = Object.assign(updated, oldLion);

И, если oldLion - это array, numeric-properties будет добавлено к объекту updated, как вы можете видеть на следующем примере:

const updated = {somekey: "somevalue"};
console.log(Object.assign(updated, [{somekey: "updatedValue"}]));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Итак, вы генерируете неожиданную структуру, как вы упомянули:

[
  {
    "id": "2",
    "name": "Nasus",
    "pride": "2",
    "age": "2",
    "gender": "female"
  },
  {
    "0": { // <-- This should not be here
        "id": "1",
        "name": "Teemo",
        "pride": "1",
        "age": "1",
        "gender": "female"
    },
    "age": "1",
    "gender": "female",
    "name": "LuLu",
    "pride": "LoL"
  }
]

ОБНОВЛЕНИЕ

Однако,после прочтения вашего другого исправленного комментария и понимания того, что вы пытаетесь сделать, возможно, лучше использовать Array.findIndex () и написать свой put() метод следующим образом:

app.put('/lions/:id', function(req, res)
{
    const paramId = req.params.id;
    const updated = req.body;

    if (updated.id)
        delete updated.id;

    // Here I find the oldLion to replace by id:
    const oldLionIdx = lions.findIndex(lion => lion.id === paramId);

    if (oldLionIdx < 0)
       res.send();

    // Here I update the object with the new "lion" properties:
    const newLion = Object.assign(lions[oldLionIdx], updated);
    console.log('newLion', newLion);

    res.json(newLion);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...