【问题标题】:Prefill Mustache.JS Template with Values from Mongo DB (Mongoose)使用 Mongo DB (Mongoose) 中的值预填充 Mustache.JS 模板
【发布时间】:2018-10-30 00:42:36
【问题描述】:

我目前在我的数据库中有一个包含一些条目的列表。现在我希望用户能够编辑其中一个条目。

当点击“编辑”按钮时,它应该加载原始表单并使用已经存储在数据库中的值预填充所有字段。

我在表单中使用了一个小胡子模板,如下所示:

<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1>Issue Form</h1>
<p>{{ errors }}</p>

<form method="post">

<label>Title: <br><input type="text" name="title">{{ value }}</label><br>

<label>Description: <br><textarea type="text" name="description">{{ value }} 
</textarea></label><br>

<label>Priority: <br>

<select name="priority">
<option>high</option>
<option>medium</option>
<option>low</option>
</select>

</label><br>

<input type="submit" value="Save Entry">

</form>

</body>
</html>

这是我的猫鼬模式:

var issueSchema = new mongoose.Schema({
  title: String,
  description: String,
  priority: String
});

我当然对如何填写我的领域做了很多研究。我阅读了有关猫鼬“populate()”函数的信息,但是当我尝试使用它时,总是有一些错误告诉我该函数本身是未定义的。 另一种选择是使用 JSON 文件来存储数据值,但在此示例中我不能这样做,因为这些值应始终存储在我的 MongoDB 数据文件夹中。

我发现的另一个版本是通过 toObject() 函数创建一个对象。但是任何时候我都试过了:

router.get('/edit/:id', (req, res) => {

  var objectForEditing = issueModel.findOne(req.params.id).toObject;
  console.log(objectForEditing);
  res.render('issueFormEdit');

});

console.log 部分将对象显示为未定义。

像我之前在任何其他 javascript 文件中那样使用 JQuery 也不起作用,即使包含模块也是如此。

我只需要一种方法来将我的 javascript 代码与我的 hjs 文件连接起来。 但我根本无法做到这一点,我的知识还不够。我真的尝试了很多,到目前为止已经投入了几个小时。但我根本无法深入了解如何连接这两个文件。

这是我第一次使用 Mustache.JS 和 MongoDB/Mongoose/Express 的组合。请温柔一点:(

如果需要更多代码,请告诉我。

【问题讨论】:

    标签: mongodb express mongoose mustache


    【解决方案1】:

    您的代码有以下问题列表:

    1) Model.prototype.findOne() 方法是异步的,所以你要么需要使用async/await 要么在调用toObject() 之前使用promise。

    2)您以错误的方式查询猫鼬。您需要使用findOneById(id)findOne({ _id: id })

    3) toObject 是一个函数,所以必须调用它。

    4) objectForEditing 需要作为代表locals 的第二个参数传递给res.render 函数,基本上是:

    一个对象,其属性定义视图的局部变量

    试试这个代码(异步/等待):

    router.get('/edit/:id', async (req, res) => {
      let objectForEditing = await issueModel.findOneById(req.params.id);
      objectForEditing = objectForEditing.toObject();
      res.render('issueFormEdit', objectForEditing);
    });
    

    使用承诺:

    router.get('/edit/:id', (req, res) => {
          issueModel.findOneById(req.params.id)
            .then(issue => {
              const objectForEditing = issue.toObject();
              res.render('issueFormEdit', objectForEditing);
            });
    });
    

    【讨论】:

    • 非常感谢您的帮助。 Promise 版本正是我需要的东西。也非常感谢您指出我的错误。这对我帮助很大!
    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2017-10-29
    • 2014-11-20
    • 1970-01-01
    • 2015-08-07
    相关资源
    最近更新 更多