使用Mongo DB(Mongoose)中的值预填充Mustache.JS模板

时间:2018-10-29 15:27:06

标签: mongodb express mongoose mustache

我当前在数据库中有一些条目的列表。现在,我希望用户能够编辑这些条目之一。

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

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

<!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的组合。请轻柔:(

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

1 个答案:

答案 0 :(得分: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);
        });
});