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
相关产品推荐
相关产品推荐

