将json传递给EJS

时间:2017-10-27 22:36:39

标签: json node.js mongodb get ejs

我正在尝试将数据从我的数据库传递到客户端(EJS模板)。 但是,数据没有输出,我没有收到任何错误。 所以我试着将数据控制台。将数据记录到我的终端,它确实显示,它只是没有显示在ejs页面上。

这是我的代码:

<div class="row">
    <!-- LOCAL INFORMATION -->
    <div class="col-sm-6">
        <div class="well">
            <h3><span class="fa fa-user"></span> Local</h3>

            <p>
                <strong>id</strong>: <%= user._id %><br>
                <strong>email</strong>: <%= user.local.username %><br>
                <strong>password</strong>: <%= user.local.password %><br />
                <strong>text</strong>: <%= text %>
            </p>
        </div>
    </div>

这是后端:

  app.get('/profile', isLoggedIn, (req, res) => {
    var text;
    MongoClient.connect("mongodb://localhost:27017/manage", (err, db) => {
      db.collection("data", (err, collection) => {
        collection.find().toArray((err, res) => {
          if(err){
            throw err;
          }
          text = res[0].string;
          console.log(text);
        });
      });
    });
    res.render('auth/profile', {
      user: req.user,
      text: text
    });
  });

请注意,有一个console.log(text),它会向终端输出正确的文本,我只是将问题传递给客户端。所有用户的数据也正确输出。

1 个答案:

答案 0 :(得分:2)

您需要在查询的回调中使用res.render,例如:

 app.get('/profile', isLoggedIn, (req, res) => {
    var text;
    MongoClient.connect("mongodb://localhost:27017/manage", (err, db) => {
      db.collection("data", (err, collection) => {
        collection.find().toArray((err, response) => {
          if(err){
            throw err;
          }
          text = response[0].string;
          console.log(text);
          res.render('auth/profile', {
           user: req.user,
           text: text
          });
        });
      });
    });
  });

现在设置它的方式是在回调完成之前执行它并且超出范围。此外,您通常不希望将数据库连接放在路由中。您可能希望在节点服务器启动时执行一个数据库连接,然后将该连接传递给路由以重新使用连接,否则每次路由被命中时,都会重新连接到数据库。

要添加,您也不希望throw err,因为这将停止您的节点进程(我假设您正在使用快速?)。而只是记录错误或返回res.render并包含错误,以便您可以在视图中处理错误。

编辑:

toArray的回调中,您必须将回复的名称从res更改为responseres以外的任何内容,因此您不要覆盖服务器res对象。