#javascript #arrays #node.js #express #put
#javascript #массивы #node.js #выразить #поместить
Вопрос:
Репо: https://github.com/leongaban/api-design-node/tree/master
Моя коллекция почтальонов: https://www.getpostman.com/collections/b5a03b07836ad34b7758
Ожидаемый:
Текущие символы «lion»:
[
{
"id": "1",
"name": "Teemo",
"pride": "LoL",
"age": "1",
"gender": "male"
},
{
"id": "2",
"name": "Nasus",
"pride": "LoL",
"age": "10",
"gender": "male"
}
]
ПОМЕСТИТЬ http://localhost:3000/lions/1
Тело:
{
"age": "1",
"gender": "female",
"name": "LuLu",
"pride": "LoL"
}
Следует вернуть этот новый список при ПОЛУЧЕНИИ всех львов:
[
{
"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. На
app.put()
, когда вы это сделаетеconst oldLion = lions.filter((lion => lion.id === paramId))
, вы получите массив в качестве результата. Я полагаю, вы хотите использовать Array.find() вместо filter там, потому что позже вы вызываете это:const newLion = Object.assign(updated, oldLion)
.2. Это было именно так
const oldLion = lions.find((lion => lion.id === paramId))
, мне также нужно было обновить мой объект.назначитьconst newLion = Object.assign({ id: oldLion.id }, updated)
хотите опубликовать ответ?3. Конечно, я дам ответ в ближайшее время…
Ответ №1:
Одна из потенциальных проблем, которая может быть связана с 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);
});