' ID'在NodeJs端点中引用JSON对象时未定义

时间:2018-03-16 22:59:59

标签: javascript arrays json node.js

我是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}`));

1 个答案:

答案 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同样如此。