You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将控制器返回数据作为EJS数据使用?Node.js项目技术问询

解决Express + Passport下从控制器传数据到EJS视图的问题

我来帮你梳理完整的实现流程,确保你能成功把客户列表从控制器传递到Dashboard视图,同时保证路由的登录保护生效:

1. 完善路由文件(routes.js)

首先要确保你的路由正确调用控制器的方法,并且把控制器返回的数据传递给EJS视图:

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

// 自定义Passport登录验证中间件
function isLoggedIn(req, res, next) {
  // 检查用户是否已通过Passport认证
  if (req.isAuthenticated()) {
    return next();
  }
  // 未登录则重定向到登录页
  res.redirect('/login');
}

// 受保护的仪表盘路由,调用控制器获取客户数据并渲染视图
router.get('/dashboard', isLoggedIn, async (req, res) => {
  try {
    // 调用控制器的方法获取客户列表
    const clients = await clientController.getClients();
    // 把客户数据和用户信息传给EJS视图
    res.render('dashboard', { 
      user: req.user, 
      clients: clients 
    });
  } catch (err) {
    console.error('获取客户列表失败:', err);
    res.status(500).send('服务器内部错误');
  }
});

module.exports = router;

2. 实现客户端控制器(clientController.js)

这里模拟从数据库获取客户数据的逻辑,你可以替换成实际的数据库查询(比如MongoDB、PostgreSQL):

// 模拟客户数据,实际项目中替换为数据库查询
const mockClients = [
  { id: 1, name: 'ABC公司', contact: '张三', email: 'zs@abc.com' },
  { id: 2, name: 'XYZ科技', contact: '李四', email: 'ls@xyz.com' }
];

// 获取客户列表的方法,返回Promise适配异步路由
exports.getClients = async () => {
  // 这里可以写实际的数据库查询逻辑,比如:
  // return await Client.find();
  return new Promise(resolve => {
    setTimeout(() => resolve(mockClients), 500); // 模拟异步请求延迟
  });
};

3. EJS视图渲染(views/dashboard.ejs)

在EJS视图中接收并渲染客户列表数据,同时可以展示登录用户的信息:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>仪表盘</title>
</head>
<body>
  <h1>欢迎回来,<%= user.username %>!</h1>
  
  <h2>客户列表</h2>
  <% if (clients.length > 0) { %>
    <ul>
      <% clients.forEach(client => { %>
        <li>
          <strong><%= client.name %></strong> - 联系人:<%= client.contact %>,邮箱:<%= client.email %>
        </li>
      <% }) %>
    </ul>
  <% } else { %>
    <p>暂无客户数据</p>
  <% } %>
  
  <a href="/logout">退出登录</a>
</body>
</html>

关键注意事项

  • 确保你的Passport配置已经正确初始化,req.isAuthenticated()能正常判断用户登录状态
  • 控制器方法如果涉及数据库操作,一定要用异步/await处理,避免回调地狱
  • EJS文件要放在Express配置的视图目录下(默认是views/),并且确保你已经在Express中设置了EJS视图引擎:
    app.set('view engine', 'ejs');
    

内容的提问来源于stack exchange,提问作者Sam Bunting

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:51:14