Nodejs 求助,req.params 的问题

Nodejs 求助,req.params 的问题

routes 中的 exports.detailres.render(‘detail’,{product:req.params.product}); 然后路由配置 app.get(’/detail/:product’,routes.detail); 最后在 EJS 中 <% =product.name%> 为什么不行呢? 显示 null

7 回复

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

根据你的描述,问题可能出在路由参数的接收或传递上。让我们逐步检查并解决这个问题。

  1. 确保 req.params 被正确设置:在路由中定义的参数 :product 应该会被自动映射到 req.params 对象中。

  2. 确保 product 是一个对象:如果 req.params.product 是一个字符串而不是一个对象,那么在模板中直接访问 product.name 会返回 null

  3. 确保 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

如果仍然有问题,请确保前端发送的请求和后端路由配置匹配。

回到顶部