无法在我的视图中为我的快速应用呈现数据

时间:2017-12-26 17:17:23

标签: javascript express ejs bookshelf.js

我试图从我的网页中呈现的数据库中返回数据,但是无法这样做。我使用ejs作为我的模板引擎,书架(orm)并表达为我的节点框架。

我的模型看起来像这样:

'use strict';

var bookshelf = require('../bookshelf');

var Contact = bookshelf.Model.extend({
  tableName: 'contacts',
});

module.exports = Contact;

我的控制器看起来像这样:

function list(req, res, next) {
  new Contact().fetchAll()
    .then(function(contacts) {
      var contacts = contacts.toJSON();
      var contacts = JSON.stringify(contacts);
       console.log(contacts)
      res.render('contacts', {
        contacts: contacts
      });
    }).catch(function(error) {
      console.log(error);
      res.send('An error occured');
    })
}

我的模板看起来像这样:

<% include partials/header %>
      <h1><%= test %></h1>
      <ul>
        <% contacts.forEach(function(contacts){ %>
          <li><%= contacts.firstName%></li>
        <% }) %>
      </ul>
<% include partials/footer %>

我希望发生的是,每个联系人都会在页面上显示他们的名字。但是,即使console.log语句(在控制器中)在控制台中显示此内容,也不会显示任何内容:

[{"id":1,"firstName":"tom","lastName":"jones","emailAddress":"joney@test.com"},{"id":2,"firstName":"don","lastName":"jon","emailAddress":"don@test.com"}]

因此数据从数据库返回,而不是在我的视图中呈现。有人可以帮助我解决我做错的事吗?

方法2:

以下是我尝试过的新方法。然而,这只会导致JSON显示在我的网页上。

function list(req, res) {
Contact.fetchAll()
    .then(contacts => res.json({
          contacts
        })
    ).catch(function(error){
      console.log(error);
      res.send('An error occured');
    })
}

2 个答案:

答案 0 :(得分:0)

似乎bookhelf orm会返回一个collection对象,您可以使用.toArray()方法将其转换为数组,然后将其传递给您的视图,而无需调用JSON.stringify,试试这个:

function list(req, res, next) {
    new Contact().fetchAll()
        .then(function(contacts) {
            res.render('contacts', {
                contacts: contacts.toArray()
            });
        }).catch(function(error) {
            console.log(error);
            res.send('An error occured');
        });
}

答案 1 :(得分:0)

您的联系人集合似乎是toJSON()的两倍。如果您之后要打{{1​​}},则无需明确致电toJSON(),因为该方法已经自行调用JSON.stringify()

然而,这不是问题所在。真正的问题是你正在对集合进行字符串化,这意味着它在模板上使用时是一个字符串,因此无法将其视为对象。

如果您只删除.toJSON()部分,它应该可以正常工作。