无法通过req params在URL请求中添加id

问题描述 投票:0回答:1

我想通过 id 从猫鼬服务器检索产品,但 req.params.id 不起作用。 我将 req.params.id 替换为 id 号,看看是否还有其他问题,但效果很好。

这是代码

router.route("/:id").get(getProductById);
const getProductById = asyncHandler(async (req, res) => {
  const product = await Product.findById(req.params.id);
  if (product) {
    return res.json(product);
  } else {
    res.status(404);
    throw new Error("Resource not found");
  }
});

我想通过 id 获取产品,但 req.params.id 没有做任何事情。

node.js mongodb express mongoose backend
1个回答
0
投票

您遇到的问题,即

req.params.id
未按预期工作,可能与几个不同的因素有关。由于用硬编码 ID 替换
req.params.id
效果很好,问题可能在于如何解析或访问路由参数。以下是一些可能的原因和解决方案:

1.确保中间件顺序

确保任何解析 URL 参数的中间件均已正确设置且顺序正确。对于 Express,您通常使用

express.json()
express.urlencoded()
中间件。但是,路由参数应该在没有用于解析 JSON 或 URL 编码数据的特定中间件的情况下工作,因为它们是 URL 路径的一部分。

const express = require('express');
const app = express();
const router = express.Router();

// Make sure to use any necessary middleware here
app.use(express.json()); // For parsing application/json
app.use(express.urlencoded({ extended: true })); // For parsing application/x-www-form-urlencoded

// Define your routes
app.use('/api/products', router);

2.检查路线定义

确保正确设置路线定义以捕获

id
参数。您提到使用
router.route("/:id").get(getProductById);
。这应该足够了,但请检查:

  • 使用路由器时正确设置基本路径(例如,
    /api/products
    )。
  • 在请求到达此路由之前,没有其他路由或中间件可以拦截请求。

3.调试和日志记录

添加一些日志记录以验证命中路线时

req.params
包含的内容。这可以帮助确定参数设置是否正确:

const getProductById = asyncHandler(async (req, res) => {
  console.log('Request Params:', req.params); // Debugging log

  const product = await Product.findById(req.params.id);
  if (product) {
    return res.json(product);
  } else {
    res.status(404);
    throw new Error("Resource not found");
  }
});

添加此内容后,请在发出请求时检查服务器日志以查看

req.params
包含的内容。如果
req.params.id
undefined
,那么问题在于如何捕获路线参数。

4.验证
asyncHandler

如果您使用自定义

asyncHandler
中间件,请确保它将
req
res
正确传递给处理函数。
asyncHandler
的典型实现如下所示:

const asyncHandler = fn => (req, res, next) => {
  Promise.resolve(fn(req, res, next)).catch(next);
};

5.检查路由调用

确保您以正确的路径到达正确的端点。例如,如果路由设置为

/api/products/:id
,那么请求URL应该是这样的:

GET /api/products/1234567890

如果您将请求发送到不同的端点或缺少

id
部分,则
req.params.id
将不会被设置。

6.版本兼容性

确保您使用兼容版本的

express
mongoose
:

  • Express
    4.x.x
    (截至当前稳定版本)。
  • Mongoose
    5.x.x
    6.x.x
    (确保它符合您的应用程序的要求)。

7.检查是否有拼写错误或冲突

仔细检查您的路线是否有任何拼写错误或与其他路线冲突。例如,上面定义的匹配更广泛模式的路由可能正在捕获请求。

带有调试功能的示例代码

这是您的代码,其中包含额外的调试步骤,可帮助识别问题:

const express = require('express');
const router = express.Router();
const asyncHandler = require('express-async-handler');
const Product = require('./models/Product'); // Adjust path to your Product model

// Route for fetching product by ID
router.route("/:id").get(asyncHandler(async (req, res) => {
  console.log('Request Params:', req.params); // Debugging log

  const product = await Product.findById(req.params.id);
  if (product) {
    return res.json(product);
  } else {
    res.status(404);
    throw new Error("Resource not found");
  }
}));

module.exports = router;

结论

通过执行这些步骤,您应该能够确定为什么

req.params.id
未按预期工作。记录参数并检查中间件设置将帮助您查明问题所在。如果您需要进一步的帮助,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.