#javascript #mongodb #handlebars.js #handlebarshelper
#javascript #mongodb #handlebars.js #handlebarshelper
Вопрос:
У меня есть экспресс-приложение, в котором вы можете создавать и просматривать сообщения. Я пытаюсь сделать так, чтобы рядом с публикацией пользователя появлялся значок редактирования, если они это сделали. Я пытался сделать это с помощью помощника на руле.
editIcon: function (user, loggedUser, floating = true) {
console.log(user, loggedUser);
if (user._id.toString() == loggedUser._id.toString()) {
if (floating) {
return `<div>edit icon</div>`;
}
} else {
return '';
}
},
В основном пользователь — это user._id. loggedUser — это идентификатор внутри сообщения, и он совпадает с идентификатором пользователя.
Вот как выглядит мой руль:
{{#each posts}}
<div class="post-extra">
<div class="card-image">
<!-- User is the logged in user and then post id (_id) -->
{{{editIcon user _id}}}
</div>
<a href="#" class="user-link">{{user.username}}</a>
<h2>{{postTitle}}</h2>
</div>
{{else}}
<p>No posts to display</p>
{{/each}}
</div>
Проблема в том, что когда я консольный журнал user и loggedUser, возвращаемые идентификаторы отличаются. Однако в моем mongodb идентификатор пользователя и идентификатор пользователя внутри сообщения совпадают.
Мои объекты post и user:
Публикация:
_id:ObjectId("5f8523d8b58f4919908e3895") <-- this is being returned..
postTitle:"Test post"
postBody:"<div>stuff</div>"
user:ObjectId("5f8522c9c0ec222ea4b7c8c0") <-- instead of this
createdAt:2020-10-13T03:49:44.333 00:00
__v:0
Пользователь:
_id: ObjectId("5f8522c9c0ec222ea4b7c8c0"), // User id
username: 'test',
email: 'test@gmail.com',
password: 'hashed password here',
createdAt: 2020-10-13T03:45:13.018Z,
__v: 0
Комментарии:
1. Почему
user
передаетсяeditIcon
дважды в{{{editIcon user user _id}}}
?2. @76484 Опечатка. Просто исправил это сейчас. Все в сообщении по-прежнему применяется, хотя и остается тем же самым.
3. Какие
id
значения регистрируются и какие значения вы ожидаете.4. @76484 пользователь. _id регистрирует весь пользовательский объект, включая идентификатор. Зарегистрированный пользователь регистрирует идентификатор записи. В моем сообщении у меня есть пользователь с идентификатором пользователя. Я хочу посмотреть, является ли пользователь. _id соответствует идентификатору пользователя внутри сообщения, если он есть, то рядом с этим сообщением отображается значок редактирования.
5. Я не понимаю, как
user._id
можно было бы хранить весь пользовательский объект. Но похоже_id
, что аргументом для помощника является идентификатор записи. Вы должны иметь возможность передать свойство Postuser
помощнику и получить от него идентификатор. Возможно, если бы вы опубликовали данные — объекты Post и User — вы смогли бы получить более конкретную помощь.
Ответ №1:
Поскольку вы вызываете своего editIcon
помощника as {{{editIcon user _id}}}
, вы передаете user
из post
и _id
из post
. Это неверно, потому что вы хотите сравнить user
сообщение с user
запросом (вошедшим в user
систему).
Из приведенного вами примера неясно, есть ли у вас доступ к user
запросу в вашем шаблоне. Если вы это сделаете, он, безусловно, не будет вложен в post
объект, поэтому вам понадобится путь для расширения контекста или двух для доступа к нему. Результат будет выглядеть примерно так:
{{{editIcon user ../user}}}
В этом примере вошедший в user
систему является родственным элементом posts
массива, но ваша структура данных может отличаться.
Я создал скрипку для вашей справки.
Комментарии:
1. Сначала я хочу поблагодарить вас за то, что вы потратили столько времени на мою проблему. Итак, я просмотрел предоставленную скрипку, и моя структура данных такая же, как в примере. Однако, когда я добавляю. _id для зарегистрированного пользователя становится неопределенным. Я заполняю страницу пользователями и имею ` user: { // Подключает пользователя к типам сообщений: mongoose. Схема. Типы. ObjectId, ссылка: ‘LocalUser’, },` в моей схеме сообщений. Я действительно чувствую, что перепробовал все.
2. В этом случае я бы предложил зарегистрировать зарегистрированного пользователя, чтобы узнать, какие свойства у него есть.