将 Knex.js select 的结果传递给 ejs 模板

Pass result of Knex.js select to ejs template

我目前正在使用 Express 开发一个项目,我正在使用 knex.js 进行查询和迁移。

我有一段时间没有接触节点,所以我有点生疏。本质上,我正在尝试从我的 table 之一中获取 select 记录,然后在我的一条路线中调用该函数,然后遍历并将其输出到我的 ejs 模板中。

单位模型

'use strict'
const knex = require('knex')(require('../../knexfile'))
module.exports = function(app) {

    this.getAll = function() {
        knex.select('id', 'unit_prefix', 'unit_name').from('units').then(function(units) {
            return units;
        })
    }
    return this
}

然后在我的routes.js文件中:

 app.get('/dashboard', ensureAuthenticated, function(req, res) {
        // console.log(req.user)
        console.log(unitModel.getAll)
        res.render('dashboard', { user: req.user, units: unitModel.getAll })
    })

如果我 console.log unitModel.getAll 的结果我得到 [Function]。我已经了解了 knex 如何使用 promises 并且是异步的,但是我仍然没有设法使用其他答案来解决我相当简单的问题。

在我的 dashboard.ejs 文件中,我有以下代码:

<h3>Jump to unit:</h3>
             <%if (units.length > 0) { %>
              <% units.forEach(function(unit) { %>
                <div class="dashboard-course-item" tooltip="First year unit, covers the basics of web foundations">
                  (<%= unit.unit_prefix %>) <%= unit.unit_name %>
                </div>
              <% }) %>
              <% } else { %>
                <strong>Currently no units have been created.</strong>
              <% } %> 

我目前在 units table 中有一条记录并且总是看到 Currently no units have been created. 消息。

我需要将什么更改为 return 我可以在我的 ejs 模板中迭代的数组或对象?

提前致谢!

在他们的 .then 回调函数中异步承诺 return 它们的值,如果你 return 承诺本身它将 return undefined 因为在那一刻承诺仍然没有解决.

要使您的代码正常工作,您应该这样做:

单位模型

'use strict'
const knex = require('knex')(require('../../knexfile'))
module.exports = function(app) {

this.getAll = function(){
   return new Promise(function(resolve,reject) {
    knex.select('id', 'unit_prefix', 'unit_name').from('units')
     .then(function(units) { resolve(units);})
     .catch(function(error) {reject(error);})
 })
}
return this
}

routes.js

app.get('/dashboard', ensureAuthenticated, function(req, res) {
    // console.log(req.user)
    unitModel.getAll()
      .then(function(units){        
        res.render('dashboard', { 
         user: req.user, 
         units: units
    })
   })
})