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

Express项目中如何将Knex.js查询结果传递至EJS模板?

嘿,我来帮你把这个流程理顺!好久没碰Node.js确实容易忘细节,咱们一步步搞定从数据库查数据到EJS渲染的全流程:

1. 先把你的Unit Model补全并修正异步问题

你当前的getAll函数没有返回Knex的查询结果(Promise),这是关键问题——Knex的所有数据库操作都是异步的,必须通过Promise来获取结果。修正后的模型代码:

'use strict'
const knex = require('knex')(require('../../knexfile'))

module.exports = function(app) {
  this.getAll = function() {
    // 一定要return这个查询Promise,这样路由里才能拿到结果
    return knex.select('id', 'unit_prefix', 'unit_name') // 补全你需要查询的所有字段
      .from('units') // 替换成你的实际数据表名
  }
}
2. 在Express路由中调用模型并传递数据到EJS

假设你的路由文件是routes/units.js,用async/await来处理异步查询会更清晰:

const express = require('express')
const router = express.Router()
// 实例化Unit模型,注意路径要和你的项目结构匹配
const Unit = require('../models/Unit')(app)

// 单位列表页路由
router.get('/', async (req, res) => {
  try {
    // 用await等待查询完成,拿到结果
    const units = await Unit.getAll()
    // 把查询到的units数组传给EJS模板,模板里可以直接用这个变量
    res.render('units/list', { units })
  } catch (err) {
    // 别忘了处理错误,避免服务器挂掉
    console.error('获取单位数据失败:', err)
    res.status(500).send('服务器内部错误')
  }
})

module.exports = router

如果你习惯用.then()写法,也可以替换成:

router.get('/', (req, res) => {
  Unit.getAll()
    .then(units => res.render('units/list', { units }))
    .catch(err => {
      console.error('获取单位数据失败:', err)
      res.status(500).send('服务器内部错误')
    })
})
3. 在EJS模板中遍历输出数据

假设你的EJS模板文件是views/units/list.ejs,这样写就能遍历显示数据:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>单位列表</title>
</head>
<body>
  <h2>所有单位</h2>
  <% if (units.length) { %>
    <table border="1">
      <thead>
        <tr>
          <th>ID</th>
          <th>单位前缀</th>
          <th>单位名称</th>
        </tr>
      </thead>
      <tbody>
        <% units.forEach(unit => { %>
          <tr>
            <td><%= unit.id %></td>
            <td><%= unit.unit_prefix %></td>
            <td><%= unit.unit_name %></td>
          </tr>
        <% }) %>
      </tbody>
    </table>
  <% } else { %>
    <p>暂无单位数据</p>
  <% } %>
</body>
</html>

这里用了表格来展示数据,也可以换成列表,核心是用forEach遍历units数组,用<%= %>输出字段值,同时加了空数据的判断,避免数组为空时出现奇怪的渲染。

几个容易踩的坑
  • 异步处理:千万不要试图同步获取Knex的查询结果,必须用Promise/async/await或者回调,这是Node.js异步编程的基础!
  • 路径检查:确保knexfile.js的引入路径、模型文件的引入路径都和你的项目结构一致,不然会报模块找不到的错误。
  • 错误捕获:数据库查询可能会因为网络、SQL语法、权限等问题失败,一定要加错误处理逻辑,不然小问题会导致服务器崩溃。

内容的提问来源于stack exchange,提问作者Matt Kent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:35:56