(NodeJs, React) ERROR hook - 500 (Internal Server Error)
Файл CreatePage.js
import React, {useContext, useEffect, useState} from 'react'
import {useHttp} from "../hooks/http.hook"
import {AuthContext} from "../context/AuthContext"
import {useHistory} from 'react-router-dom'
export const CreatePage = () => {
const history = useHistory()
const auth = useContext(AuthContext)
const {request} = useHttp()
const [link, setLink] = useState('')
useEffect(() => {
window.M.updateTextFields()
}, [])
const pressHandler = async event => {
if (event.key === 'Enter') {
try {
const data = await request('/api/link/generate', 'POST', {from: link}, {
Authorization: `Bearer ${auth.token}`
})
history.push(`/detail/${data.link._id}`)
} catch (e) {}
}
}
return (
<div className="row">
<div className="col s8 offset-s2" style={{paddingTop: '2rem'}}>
<div className="input-field">
<input
placeholder="Вставьте ссылку"
id="link"
type="text"
value={link}
onChange={e => setLink(e.target.value)}
onKeyPress={pressHandler}
/>
<label htmlFor="link">Введите ссылку</label>
</div>
</div>
</div>
)
}
Файл http.hook.js
import {useState, useCallback} from 'react'
export const useHttp = () => {
const [loading, setLoading] = useState(false)
const [error, setError] = useState(null)
const request = useCallback(async (url, method = 'GET', body = null, headers = {}) => {
setLoading(true)
try {
if (body) {
body = JSON.stringify(body)
headers['Content-Type'] = 'application/json'
}
const response = await fetch(url, {method, body, headers})
const data = await response.json()
if (!response.ok) {
throw new Error(data.message || 'Что-то пошло не так')
}
setLoading(false)
return data
} catch (e) {
setLoading(false)
setError(e.message)
throw e
}
}, [])
const clearError = useCallback(() => setError(null), [])
return { loading, request, error, clearError }
}
При запуске проекта всё компилируется без ошибок. На странице CreatePage есть поле для ввода ссылки. При нажатии Enter возникает следующая ошибка:
Посмотрел что передаётся, но так и не понял в чём ошибка:

А должен получать в консоли нечто подобное.

Ответы (1 шт):
Автор решения: Евгений
→ Ссылка
Проверь файл routes.links.js. У меня в нем была ошибка: вместо link указал link в блоке router.get
Ниже приведен верный код:
const { Router } = require('express')
const config = require('config')
const shortid = require('shortid')
const Link = require('../models/Link')
const auth = require('../middleware/auth.middleware')
const router = Router()
router.post('/generate', auth, async (req, res) => {
try {
const baseUrl = config.get('baseUrl')
const { from } = req.body
const code = shortid.generate()
const existing = await Link.findOne({ from })
if (existing) {
return res.json({ link: existing })
}
const to = baseUrl + '/t/' + code
const link = new Link({
code, to, from, owner: req.user.userId
})
await link.save()
res.status(201).json({ link })
} catch (e) {
res.status(500).json({ message: "Что-то пошло не так, попробуйте снова" })
}
})
router.get('/', auth, async (req, res) => {
try {
const links = await Link.find({ owner: req.user.userId })
res.json(links)
} catch (e) {
res.status(500).json({ message: "Что-то пошло не так, попробуйте снова" })
}
})
router.get('/:id', auth, async (req, res) => {
try {
const link = await Link.findById(req.params.id)
res.json(link)
} catch (e) {
res.status(500).json({ message: "Что-то пошло не так, попробуйте снова" })
}
})
module.exports = router
