javascript - 在 NodeJs 端点中引用 JSON 对象时未定义“id”

标签 javascript arrays json node.js

我是 Javascript 的新手,一直在学习有关 NodeJs 的类(class),但一直坚持练习。

我正在为视频商店中的“流派”创建一个基本的 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}`));

最佳答案

现在我明白了你的问题。您已经为 .get 处理程序翻转了 (req, res)

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 也是如此。

关于javascript - 在 NodeJs 端点中引用 JSON 对象时未定义“id”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330594/

相关文章:

json - 如何使用 JQ 从今天的日期减去 6 个月?

java - 是否可以将 JavaScript 变量传递给 Scriptlet 内的 Java 代码

javascript - 在nodejs客户端ejs文件中获取服务器返回的数据

android - 发送 JSON Post 请求到 Contact Form 7

json - 机器人框架 - TypeError : string indices must be integers When Parsing Json

c# - 将 Array 与多个读取器线程 + 写入器一起使用

javascript - 在 AngularJS 中观察对象

Javascript 调整大图像大小仅在 F5 之后才有效

java - System.out.println不打印数组数据

java - 如何在遍历数组时删除元素