duboloms
@duboloms
Люблю есть дубы с кетчупом. Веб-разработчик.

Почему handlebars не хочет выводить данные с MongoDB?

Я делал обычную тудушку на Nodejs Handlebars и MongoDB.
Но когда я совершаю get запрос на index.hbs я передаю следующие параметры из базы данных:
router.get("/", async (req, res) => {
  const todos = await Todo.find({});

  res.render("index", {
    title: "Todos List",
    isIndex: true,
    todos
  });
});


Handlebars в консоли выдал мне ошибку:
Server has been started
Handlebars: Access has been denied to resolve the property "completed" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details
Handlebars: Access has been denied to resolve the property "title" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details

Я зашел на страницу которая указана в ошибке (https://handlebarsjs.com/api-reference/runtime-opt...)

Но там, показана работа с handlebars пакетом, а у меня стоит express-handlebars.
А в express-handlebars, нет такого места куда эту настройку можно было передать, там даже переменную result или что-то подобное я никуда не передаю.

Потом я на всякий проверил массив todos, (вывел в консоли) мне выдало:
[
  {
    completed: false,
    _id: 5ee932ae9c45385520bfb76f,
    title: 'Купить мозги',
    __v: 0
  }
]


А в index.hbs я прошелся по массиву todos и вывел title и обработал наличие true у свойства completed:
<h2>Todos page</h2>

{{#if todos.length}}
<ul>
  {{#each todos}}
  <li class="todo">
    <form action="/complete" method="POST">
      <label>
        {{#if completed}}
          <input type="checkbox" checked />
          <span class="completed">{{title}}</span>
        {{else}}
          <input type="checkbox" />
          <span>{{title}}</span>
        {{/if}}

        <button class="btn btn-small" type="submit">Save</button>
      </label>
    </form>
  </li>
  {{/each}}
</ul>
{{else}}
<p>No todos!</p>
{{/if}}


Но в index.hbs мне ничего не выдало даже названия тудушки.
Напомню, что при get запросе на index.hbs, мне вылетает ошибка:

Server has been started
Handlebars: Access has been denied to resolve the property "completed" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details
Handlebars: Access has been denied to resolve the property "title" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details

Что делать?
  • Вопрос задан
  • 2592 просмотра
Решения вопроса 1
hzzzzl
@hzzzzl
попробуй await Todo.find({}).lean()
запросы mongoose возвращают свои объекты mongoose с кучей дополнительных свойств, .lean() вернет тупо json из базы монго

https://mongoosejs.com/docs/tutorials/lean.html

я к тому, что подозреваю что там монгоос добавляет какое-то свое свойство .completed
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы