Предварительно заполните шаблон Mustache.JS значениями из Mongo DB (Mongoose) - PullRequest
0 голосов
/ 29 октября 2018

В настоящее время у меня есть список с некоторыми записями в моей базе данных. Теперь я хочу, чтобы пользователи могли редактировать одну из этих записей.

При нажатии кнопки «Редактировать» она должна загрузить исходную форму и предварительно заполнить все поля значениями, уже сохраненными в базе данных.

Я использовал шаблон усов для своей формы, похожий на этот:

<!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
});

Я, конечно, много исследовал, как заполнять свои поля. Я читал о функции mongoose "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 показывает мне объект как неопределенный.

Использование JQuery, как я делал в любом другом javascript-файле, также не работало, даже при включении модулей.

Мне просто нужен метод для соединения моего кода javascript с моим файлом hjs. Но я просто не могу этого сделать, моих знаний для этого недостаточно. Я действительно много испробовал и потратил много часов. Но я просто не могу понять, как соединить эти два файла.

Я впервые работаю с этой комбинацией Mustache.JS и MongoDB / Mongoose / Express. Пожалуйста, будьте нежны: (

Если вам понадобится больше кода, просто дайте мне знать.

1 Ответ

0 голосов
/ 29 октября 2018

Ваш код имеет следующий список проблем:

1) Model.prototype.findOne() метод является асинхронным, поэтому вам нужно либо использовать async/await, либо использовать обещания перед вызовом toObject().

2) Вы неправильно обращаетесь с мангустом. Вам нужно использовать findOneById(id) или findOne({ _id: id }).

3) toObject - это функция, поэтому ее нужно вызывать.

4) objectForEditing необходимо передать в функцию res.render в качестве второго аргумента, который представляет locals , который в основном:

объект, свойства которого определяют локальные переменные для представления

Попробуйте этот код (async / await):

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);
        });
});
...