Nodejs 求助,req.params 的问题
Nodejs 求助,req.params 的问题
routes 中的 exports.detail
中 res.render(‘detail’,{product:req.params.product});
然后路由配置 app.get(’/detail/:product’,routes.detail);
最后在 EJS 中 <% =product.name%>
为什么不行呢?
显示 null
Node.js 求助,req.params 的问题
在你的描述中,你遇到了一个问题,即在渲染 EJS 模板时,req.params.product
显示为 null
。我们可以通过检查几个关键点来解决这个问题。
路由配置
首先,确保你的路由配置正确。你的路由配置看起来是正确的:
// app.js 或其他入口文件
app.get('/detail/:product', routes.detail);
这里的 /detail/:product
表示一个 URL 模式,其中 :product
是一个动态参数。
控制器函数
接下来,确保你的控制器函数(例如 routes/detail.js
)正确处理了 req.params
参数。你的控制器函数应该类似于:
// routes/detail.js
module.exports.detail = function(req, res) {
const product = req.params.product;
// 这里可以添加获取产品详细信息的逻辑,比如从数据库查询
res.render('detail', { product });
};
这里的关键是确保 req.params.product
被正确捕获并传递给渲染函数。
EJS 模板
最后,确保你在 EJS 模板中正确地使用了传递的数据。你的 EJS 模板应该是这样的:
<!-- views/detail.ejs -->
<!DOCTYPE html>
<html>
<head>
<title>Product Detail</title>
</head>
<body>
<h1><%= product %></h1>
</body>
</html>
如果你想要访问 product
对象的属性(例如 name
),你需要确保 product
是一个对象,而不是字符串。如果 product
是一个字符串,你需要先将其转换为对象,或者在控制器中直接传递一个对象。
示例数据
假设你有一个简单的 JSON 数据结构,你可以这样处理:
// 假设这是从数据库获取的产品数据
const products = {
'123': { name: 'Product A', description: 'This is Product A' },
'456': { name: 'Product B', description: 'This is Product B' }
};
// routes/detail.js
module.exports.detail = function(req, res) {
const productId = req.params.product;
const product = products[productId];
if (product) {
res.render('detail', { product });
} else {
res.status(404).send('Product not found');
}
};
通过以上步骤,你应该能够正确地将 req.params.product
传递到 EJS 模板中,并正确显示产品的详细信息。
试试 <%=locals.product.name %>
??
还是没有显示,不知道是不是其他地方出错了,可以帮忙看下么? app.js中 ‘’‘app.get(’/detail/:product’,routes.detail);
index.js中 exports.detail = function(req, res){ Product.getOne(req.params.product,function(err,product){ Comment.get(req.params.product, function(err, comments) { if (err) { comments = []; } res.render(‘detail’, { title: ‘商品详情’, comments : comments, product : product, user : req.session.user, staff: req.session.staff, success : req.flash(‘success’).toString(), error : req.flash(‘error’).toString() }); }); }); };
detail.ejs中 <p><%=.product.name %></p> <p><%=.product.price %></p>
麻烦了!
你打印一下你的 product 看看,是什么?
你访问/detail/dell, 那么你的req.params.product就是dell dell是个字符串,你要显示 dell.name ???
他用Product.getOne()得到了一个结果: product
根据你的描述,问题可能出在路由参数的接收或传递上。让我们逐步检查并解决这个问题。
-
确保
req.params
被正确设置:在路由中定义的参数:product
应该会被自动映射到req.params
对象中。 -
确保
product
是一个对象:如果req.params.product
是一个字符串而不是一个对象,那么在模板中直接访问product.name
会返回null
。 -
确保
product
参数存在于请求中:确认前端请求是否正确传递了product
参数。
以下是修复此问题的示例代码:
路由配置
// routes.js
exports.detail = function(req, res) {
// 确保 req.params.product 存在一个对象
const product = { name: req.params.product };
res.render('detail', { product });
};
应用程序配置
// app.js 或 main server file
const express = require('express');
const routes = require('./routes');
const app = express();
app.set('view engine', 'ejs');
app.get('/detail/:product', routes.detail);
app.listen(3000, () => console.log('App listening on port 3000!'));
EJS 模板
<!-- detail.ejs -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Product Detail</title>
</head>
<body>
<h1><%= product.name %></h1>
</body>
</html>
测试
确保前端请求类似这样:
GET /detail/MyProduct
这应该能正确渲染页面,并显示 MyProduct
。
如果仍然有问题,请确保前端发送的请求和后端路由配置匹配。