Я бы хотел добавить аналогичный счетчик в мою схему Монго. Я обновляю его в 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 в моем обработчике маршрута. Любые предложения или советы будут с благодарностью.