我想通过 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 没有做任何事情。
您遇到的问题,即
req.params.id
未按预期工作,可能与几个不同的因素有关。由于用硬编码 ID 替换 req.params.id
效果很好,问题可能在于如何解析或访问路由参数。以下是一些可能的原因和解决方案:
确保任何解析 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);
确保正确设置路线定义以捕获
id
参数。您提到使用router.route("/:id").get(getProductById);
。这应该足够了,但请检查:
/api/products
)。添加一些日志记录以验证命中路线时
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
,那么问题在于如何捕获路线参数。
asyncHandler
如果您使用自定义
asyncHandler
中间件,请确保它将 req
和 res
正确传递给处理函数。 asyncHandler
的典型实现如下所示:
const asyncHandler = fn => (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch(next);
};
确保您以正确的路径到达正确的端点。例如,如果路由设置为
/api/products/:id
,那么请求URL应该是这样的:
GET /api/products/1234567890
如果您将请求发送到不同的端点或缺少
id
部分,则 req.params.id
将不会被设置。
确保您使用兼容版本的
express
和 mongoose
:
4.x.x
(截至当前稳定版本)。5.x.x
或 6.x.x
(确保它符合您的应用程序的要求)。仔细检查您的路线是否有任何拼写错误或与其他路线冲突。例如,上面定义的匹配更广泛模式的路由可能正在捕获请求。
这是您的代码,其中包含额外的调试步骤,可帮助识别问题:
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
未按预期工作。记录参数并检查中间件设置将帮助您查明问题所在。如果您需要进一步的帮助,请告诉我!