【问题标题】:nodejs api not showing product for a particular product idnodejs api未显示特定产品ID的产品
【发布时间】:2021-10-26 16:10:20
【问题描述】:

我正在尝试创建一个基本的 nodejs API(无框架)

我的文件夹结构是

controllers
     productController.js
models
     productModels.js 
data
   products.js
node_modules
package.json
package-lock.json
server.js

我正在尝试向与特定产品 ID 关联的客户发送产品数据。但我在这里面临的问题是在 productModel.js 文件中。 在该文件中,我无法过滤掉带有 id 的特定产品。一旦我在 array.prototype.find() 方法中使用 id 作为条件,它似乎无法识别 id 的值。我想知道为什么?

products.js 文件

export const products =  [
    {
      "userId": 1,
      "id": 1,
      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
    },
    {
      "userId": 1,
      "id": 2,
      "title": "qui est esse",
      "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
    },
    {
      "userId": 1,
      "id": 3,
      "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
      "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
    },
    {
      "userId": 1,
      "id": 4,
      "title": "eum et est occaecati",
      "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit"
    }]

productController.js 文件

import {findAll, findById} from '../models/productModel.js'
export const getProduct = async (req, res, id) => {
    try{
        const product = await findById(id)

        if(!product){
            res.end(JSON.stringify({message: 'Prdouct not found'}))

        }else{
            res.writeHead(200, { 'Content-Type': 'application/json' });
            res.end(JSON.stringify(product));
        }

    }catch(err){
        console.log(err)
    }
}

productModel.js 文件

import {products} from '../data/products.js'
export const findById = (id) => {
    const promise = new Promise((resolve, reject) => {       
        setTimeout(() => {
            console.log(id)
            const product = products.find(p => p.id === id)
            resolve(product)
            // reject('SERVER ERROR')
        }, 1000) 
    })
    return promise
}

server.js 文件

import http from 'http'
import { getProducts, getProduct } from './controllers/productControllers.js';

const server = http.createServer((req, res) => {
    if(req.url === '/api/products' && req.method === 'GET'){
        getProducts(req, res)
    }else if(req.url.match(/\/api\/products\/([0-9]+)/) && req.method === 'GET'){
        const id = req.url.split('/')[3]
        getProduct(req, res, id)
    }
    else{
        res.writeHead(200, { 'Content-Type': 'text/html' });
        res.end("Not found");
    }
});

const port = process.env.PORT || 8000
  
server.listen(port, () => {console.log(`Server running on port ${8000}`)});

【问题讨论】:

    标签: node.js es6-promise rest asynchronous-javascript


    【解决方案1】:

    您从req.url.split('/')[3] 获得的idstring,但您模型中的产品ID 是numbers。你正在与=== 进行比较,如果两个操作数具有不同的类型,它将返回false。因此,您的比较将始终返回false,您将找不到产品。使用

    const id = +(req.url.split('/')[3])
    

    相反,这将使id 成为一个数字。

    【讨论】:

    • 你是一个英雄,一个真正的大师,非常感谢你花你宝贵的时间看我的代码,我昨天摸不着头脑。我真是个混蛋,我为自己感到羞耻。看起来我不适合编码。我猜这就是我找不到工作的原因。
    • 请问有什么办法可以调试vs代码中的这类错误吗?
    【解决方案2】:

    似乎您正在将stringnumber 进行比较。因此"1" === 1 // false

    尝试使用 parseInt() 将路径中的 id 转换为 Int,然后将其传递给您的函数

    const id = parseInt(req.url.split('/')[3], 10)
    

    【讨论】:

    • 非常感谢你们,我没想到会有任何帮助,但天哪,你们太有帮助了。我发自内心地感谢你。我自己从来没有想过这个。请问有什么办法可以调试vs代码中的这类错误吗?
    • 尝试使用Typescript,这是了解和避免这些 javascript 滋扰的唯一方法
    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2022-08-24
    • 2014-08-30
    相关资源
    最近更新 更多