【发布时间】:2018-08-26 02:27:17
【问题描述】:
我是 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 对象当前是硬编码的。
这是请求(从 Postman 发送):
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}`));
【问题讨论】:
-
HTTP 请求是什么样的?显然
:id是未定义的。 -
genres中的所有元素都有一个id属性,所以它必须是req.params.id这就是问题所在。 -
我已经添加进去了,但是:
GET http://localhost:5000/api/genres/1 -
@RichC
.indexOf()没有错 -
当然不是,我告诉他要小心。
标签: javascript arrays json node.js