【问题标题】:'id' not defined when referencing JSON object in NodeJs endpoint在 NodeJs 端点中引用 JSON 对象时未定义“id”
【发布时间】: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


【解决方案1】:

现在我看到了你的问题。您已将 (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 也是如此。

【讨论】:

  • 做到了。毕竟我是代码盲!干杯老兄
  • 不错的收获。这些类型的错误很容易避免快速检测?
  • @ChrisYeager,是的,这两个小时我再也回不来了。啤酒时间
猜你喜欢
  • 2018-06-07
  • 2012-03-16
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2020-08-20
  • 2020-10-25
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多