Я не могу изменить значение в базе данных - массив - PullRequest
0 голосов
/ 12 марта 2020

Мне нужно обновить статус комментария, то есть имя поля «Подтвердить». С этой целью я создал скрипт AJAX, и бэкэнд кажется правильным, потому что он получает сообщение после нажатия кнопки. Я не знаю, почему я не могу сохранить значение «одобрить» в базе данных. Пожалуйста помоги. Я использую NodeJS, MongoDB, Express и E JS для внешнего интерфейса. Моя база данных: enter image description here

Мой интерфейс:

 <% post.comments.forEach(function (comment) { %>

    <tr>
        <td> <%= comment._id %> </td>
        <td> <%= comment.username %> </td>
        <td> <%= comment.comment %> </td>

        <form method="post" onsubmit="return  doApprove(this);">
            <input type="hidden" name="post_id" value="<%= post._id %>" />
            <input type="hidden" id="comment_id" name="comment_id">
                 <td> <input class="approve-comment" type="checkbox" name="approve" value="true">
                <button class="btn btn-info" value="Approve"/>
                 </td>
        </form>
        <% }) %>
    </tr>

</table>

</div>
<script>
function doApprove(form) {
    var formData= {approve:form.approve.value};
    $.ajax({
        url: "/do-edit-comment",
        method: "POST",
        data: formData,
        success: function (response) {
            formData._id =response._id;
            alert(response.text);
        }
    });
    return false;
}
</script>

Мой бэкэнд:

app.post("/do-edit-comment", function (req,res) {
    blog.collection("posts").updateOne({
        "_id": ObjectId(req.body.id),
        "comments._id": ObjectId(req.body.id)
    },{
        $set: {
            "comments": {approve: req.body.approve}

        }
    }, function (error,document) {
        res.send({

            text: "comment approved"

        });
    });
});

1 Ответ

0 голосов
/ 13 марта 2020

Чтобы обновить отдельный элемент из массива, вам нужен оператор обновления массива $[<identifer>] . Для сценария, описанного в вашем вопросе, запрос на обновление на сервере должен выглядеть примерно так:

blog.collection("posts").updateOne(
    { "_id": ObjectId(req.body.post_id), },
    { $set: { "comments.$[comment].approve": req.body.approve } }, 
    { arrayFilters: [{ "comment._id": ObjectId(req.body.commentId) }] },
    function (error, document) {
        res.send({
            text: "comment approved"
        });
    }
)

РЕДАКТИРОВАТЬ (проблемы с интерфейсом / исправление)
Так что я решил Есть также некоторые проблемы с кодом переднего конца. Это редактирование пытается объяснить / исправить эти проблемы.

Проблемы:
1. Бэкэнд ожидает commentId в объекте запроса (req.body .commentId) чтобы иметь возможность идентифицировать комментарий для обновления, но вы не отправляете его из внешнего интерфейса.
2. Бэкэнду нужен идентификатор сообщения, чтобы однозначно идентифицировать сообщение для обновления, но вы не отправляете его из внешнего интерфейса.
3. Значение approve в данных формы, отправляемых из внешнего интерфейса, является строкой и всегда будет "true". Это не то, что вы хотите, вы хотите отправить логическое значение (true или false) в зависимости от того, установлен флажок или нет.

Исправление:
Обновите шаблон формы следующим образом:

<form method="post" onsubmit="return doApprove(event);">
    <input type="hidden" name="post_id" value="<%= post._id %>" />
    <input type="hidden" id="<%= comment._id %>" name="comment_id" />
    <td> <input class="approve-comment" type="checkbox" name="approve" value="true">
        <button class="btn btn-info" value="Approve"/>
    </td>
</form>

Изменения:
- Обработчик doApprove, присоединенный к событию отправки формы, теперь вызывается с event вместо this.
- я обновил значение атрибута id для элемента input#name="comment_id" до фактического значения comment._id.

А в теге script обновите функцию doApprove до этой :

function doApprove(event) {
  event.preventDefault();
  const form = event.target;
  var formData = {
    approve: form.approve.checked, // form.approve.checked would be true if the checkbox is checked and false if it isn't
    post_id: form.post_id.value, // The value of the input#name=post_id element
    commentId: form.comment_id.id, // The id attribute of the input#name=comment_id element
  };
  $.ajax({
      url: "/do-edit-comment",
      method: "POST",
      data: formData,
      success: function (response) {
          formData._id =response._id;
          alert(response.text);
      }
  });
  return false;
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...