Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ошибка Uncaught (in promise) SyntaxError: Unexpected end of JSON input. Разрабатываю учебное приложение на NodeJs

MrTwister Мастер (1035), на голосовании 1 год назад
Делаю учебное приложение, повторил точь-в-точь как показано в видеоуроке, но мне выдаёт ошибку. Вот код из файлов где, как я думаю, спрятана ошибка (из кода обрезал ненужные детали не относящиеся к реализации кнопки "удалить из корзины"

/models/card.js
 const path = require('path') 
const fs = require('fs')

const p = path.join(path.dirname(process.mainModule.filename), 'data', 'card.json')

class Card {

static async remove(id) {
const card = await Card.fetch()

const index = card.courses.findIndex(c => c.id === id)
const course = card.courses[index]

if (course.count === 1) {
// удалить
card.courses = card.courses.filter(c => c.id !== id)
} else {
// изменить количество
card.courses[index].count--
}

card.price -= course.price

return new Promise((resolve, reject) => {
fs.writeFile(p, JSON.stringify(card), err => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}

static async fetch() {
return new Promise((resolve, reject) => {
fs.readFile(p, 'utf-8', (err, content) => {
if (err) {
reject(err)
} else {
resolve(JSON.parse(content))
}
})
})
}
}

module.exports = Card
/routes/card.js
 const { Router } = require('express') 
const router = Router()
const Card = require('../models/card')
const Course = require('../models/course')

router.delete('/remove/:id', async (req, res) => {
const card = await Card.remove(req.params.id)
res.status(200).json(card)
})

module.exports = router
/public/app.js
 const toCurrency = price => { 
new Intl.NumberFormat('ru-RU', {
currency: 'rub',
style: 'currency',
}).format(price)
}

document.querySelectorAll('.price').forEach(node => {
node.textContent = toCurrency(node.textContent)
})

const $card = document.querySelector('#card')
if ($card) {
$card.addEventListener('click', event => {
if (event.target.classList.contains('js-remove')) {
const id = event.target.dataset.id

fetch('/card/remove/' + id, {
method: 'delete',
})
.then(res => res.json())
.then(card => {
if (card.courses.length) {
const html = card.courses
.map(c => {
return `

${c.title}
${c.count}




`
})
.join('')
$card.querySelector('tbody').innerHTML = html
$card.querySelector('.price').textContent = toCurrency(card.price)
} else {
$card.innerHTML = '

Корзина пуста

'
}
})
}
})
}
Ошибку кидает в файле app.js в 28 строке:
.then(res => res.json())

Курс удаляется из корзины, всё как надо, вот только html страница не подгружается и приходится вручную перезагружать страницу чтобы отобразились изменения
Дополнен 1 год назад
В 28 строке res это объект, а после метода .json() это Promise со статусом rejected, думаю проблема в этом, но не знаю как это чинить :/
Дополнен 1 год назад
кому интересно:
я нашел ошибку, она была в файле models/card.js

return new Promise((resolve, reject) => {
fs.writeFile(p, JSON.stringify(card), err => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}

где resolve() нужно было передать card как аргумент :')
то есть так

return new Promise((resolve, reject) => {
fs.writeFile(p, JSON.stringify(card), err => {
if (err) {
reject(err)
} else {
resolve(card)
}
})
})
}
Голосование за лучший ответ
Dlazder Мудрец (16914) 1 год назад
Чтобы перезагрузить страницу можешь добавить это:
.then(res => location.reload())
MrTwisterМастер (1035) 1 год назад
спасибо за информацию, может быть где-то использую. Я кстати сам нашел ошибку путем сравнивания всех файлов проекта с файлами уже готового варианта с сайта курсов, ошибка смешная если честно, хотя я 2 часа думал)
Dlazder Мудрец (16914) MrTwister, бывает) Я сейчас проект на ноде пишу для себя, тоже какая то магия происходит, уже не знаю что делать. Код выдает ошибку и в тоже время работает... Потом окажется что в каком то месте забыл букву а ide не подсветил)
Похожие вопросы