我是Javascript的新手,并且一直在关注NodeJs的课程,并坚持练习。
我正在为'类型'创建一个基本的CRUD API。在一个组成的视频商店。
我创建了以上所有内容但是当我调用任何具有特定ID的端点时,我收到错误。
TypeError: Cannot read property 'id' of undefined
at genres.find.g (/Users/richardcurteis/Desktop/NodeJsCourse/vidly-node/index.js:60:65)
at Array.find (native)
at findGenre (/Users/richardcurteis/Desktop/NodeJsCourse/vidly-node/index.js:60:26)
问题是(我认为)与findGenre
方法有关,该方法检查是否存在具有匹配id的类型。
function findGenre(req) {
const genre = genres.find(g => g.id === parseInt(req.params.id));
if(genre) return genre;
false;
}
json
对象目前是硬编码的。
这是请求(邮递员发送):
GET > http://localhost:5000/api/genres/1
返回:
[
{
"id": 1,
"name": "Action"
},
{
"id": 2,
"name": "Horror"
},
{
"id": 3,
"name": "Drama"
}
]
我已经检查了解决方案,它看起来与我的实现相同,除了我的重构重复检查和错误代码。
也许我只是盲目地编码,但也许有人能看到我失踪的东西?
我已经包含了整个类(?)但是我说错误与json对象id的检查有关。
const Joi = require('joi');
const express = require('express');
const app = express();
app.use(express.json());
const genres = [
{ id: 1, name: 'Action' },
{ id: 2, name: 'Horror' },
{ id: 3, name: 'Drama' },
];
app.get('/api/genres', (req, res) => {
res.send(genres);
});
app.post('/api/genres', (req, res) => {
const { error } = validateGenreName(req.body);
if(error) return sendValidationError(res, error);
const genre = {
id: genres.length + 1,
name: req.body.name
};
genres.push(genre);
res.send(genre);
});
app.put('/api/genres/:id', (res, req) => {
const genre = findGenre(req);
if(!genre) return genreNotFoundError(res);
const { error } = validateGenreName(req.body);
if(error) return sendValidationError(res, error);
genre.name = req.body.name;
res.send(genre);
});
app.delete('/api/genres/:id', (res, req) => {
const genre = findGenre(req);
if(!genre) genreNotFoundError(res);
const index = genres.indexOf(genre);
genres.splice(index, 1);
res.send(genre);
});
app.get('/api/genres/:id', (res, req) => {
const genre = findGenre(req);
if(!genre) return genreNotFoundError(res);
res.send(genre);
});
// Functions
function findGenre(req) {
const genre = genres.find(g => g.id === parseInt(req.params.id));
if(genre) return genre;
false;
}
function genreNotFoundError(res) {
res.status(404).send('Genre not found');
}
function validateGenreName(genre) {
const schema = {
name: Joi.string().min(3).required()
};
return Joi.validate(genre, schema);
}
function sendValidationError(res, error) {
res.status(400).send(error.details[0].message);
}
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Listening on port ${port}`));
答案 0 :(得分:2)
现在我看到了你的问题。您已为(req, res)
处理程序翻转了.get
。
app.get('/api/genres/:id', (res, req) => {
const genre = findGenre(req);
if(!genre) return genreNotFoundError(res);
res.send(genre);
});
应该是
app.get('/api/genres/:id', (req, res) => {
const genre = findGenre(req);
if(!genre) return genreNotFoundError(res);
res.send(genre);
});
.delete
和.put
同样如此。