Как увеличить счетчик похожих в моей схеме монго - PullRequest
1 голос
/ 08 июня 2019

Я бы хотел добавить аналогичный счетчик в мою схему Монго. Я обновляю его в Redux, но теряю при обновлении и не могу сохранить его в своей базе данных. Я также приложил свой поток удаления (который работает), чтобы дать некоторый контекст.

вот мои создатели действий

export const remove = id => ({
  type: REMOVE_MESSAGE,
  id
});

export const like = (id, messages) => {
  return {
    type: LIKE_MESSAGE,
    id,
    messages
  };
};

export const likeMessage = (user_id, message_id) => {
  return dispatch => {
    return apiCall("put", `/api/users/${user_id}/messages/${message_id}`)
      .then(() => dispatch(like(message_id)))
      .catch(err => addError(err.message));
  };
};

export const removeMessage = (user_id, message_id) => {
  return dispatch => {
    return apiCall("delete", `/api/users/${user_id}/messages/${message_id}`)
      .then(() => dispatch(remove(message_id)))
      .catch(err => addError(err.message));
  };
};

и мои редукторы

const message = (state = [], action) => {
  switch (action.type) {
    case LOAD_MESSAGES:
      return [...action.messages];

    case REMOVE_MESSAGE:
      return state.filter(message => message._id !== action.id);

    case LIKE_MESSAGE:
      return state.map(message => {
        if (message._id === action.id) {
          return Object.assign({}, message, { likes: message.likes + 1 });
        }
        return message;
      });

    default:
      return state;
  }
};

Вплоть до этого, кажется, работает. Это мои обработчики маршрутов на стороне сервера, опять же, это просто маршрут likeMessage, который доставляет мне проблемы, и я уверен, что именно в этом заключается проблема.


exports.deleteMessage = async function(req, res, next) {
  try {
    let foundMessage = await db.Message.findById(req.params.message_id);
    await foundMessage.remove();
    return res.status(200).json(foundMessage);
  } catch (err) {
    return next(err);
  }
};

exports.likeMessage = async function(req, res, next) {
  try {
    let like = await db.Message.findByIdAndUpdate(
      req.params.message_id,
      {
        $inc: { "message.$.likes": 1 }
      },
      { new: true }
    );
    await like.save();
    return res.status(200).json(like);
  } catch (err) {
    return next(err);
  }
};

вот моя модель сообщения

const mongoose = require("mongoose");
const User = require("./user");

const messageSchema = new mongoose.Schema(
  {
    text: {
      type: String,
      required: true,
      maxLength: 160
    },
    user: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User"
    },
    likes: {
      type: Number,
      default: 0
    }
  },
  {
    timestamps: true
  }
);

messageSchema.pre("remove", async function(next) {
  try {
    let user = await User.findById(this.user);
    user.messages.remove(this.id);
    await user.save();
    return next();
  } catch (err) {
    return next(err);
  }
});

const Message = mongoose.model("Message", messageSchema);
module.exports = Message;

и мой файл маршрутов, на всякий случай.

const express = require("express");
const router = express.Router({ mergeParams: true });

const {
  createMessage,
  getMessage,
  deleteMessage,
  likeMessage
} = require("../handlers/messages");

router.route("/").post(createMessage);

router
  .route("/:message_id")
  .get(getMessage)
  .delete(deleteMessage)
  .put(likeMessage);

module.exports = router;

Извиняюсь за весь код, я почти уверен, что это связано с тем, как я обрабатываю оператор $ inc в моем обработчике маршрута. Любые предложения или советы будут с благодарностью.

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