Проблема с приведением с использованием Router.put с mongoDB в приложении MERN - PullRequest
0 голосов
/ 17 января 2020

Я хочу подключить router.put, который будет обновлять Boolean (isOn) в переключателе, но сначала я хотел попробовать, как это работает, и теперь я столкнулся с проблемой.

const express = require("express");
const router = express.Router();
const Buttons = require('../../models/Buttons');

// GET buttons
// This request works perfect
router.get('/', (req,res) => {
 Buttons.find()
.sort({name: 1})
.then(buttons => res.json(buttons))
});

// PUT buttons
// This one doesnt work at all
router.put('/:name', function(req,res,next) {
    Buttons.findByIdAndUpdate({name: req.params.name},         
 req.body).then(function(){
    Buttons.findOne({name: req.params.name}).then(function(buttons){
        res.send(buttons);
    });
});
 });

 module.exports = router;

Модель Кнопки имеют только имя: String, обязательный: true и isOn: логический, обязательный: true и данные в БД выглядят так:

enter image description here

Можете ли вы сказать мне, что я тут не так сделал?

Код кнопки модальный:

const mongoose = require('mongoose');
const Schema = mongoose.Schema

const buttonSchema = new Schema ({
name: {
type: String,
required: true
},
isOn: {
type: Boolean,
required: true
}
});

 module.exports = Buttons = mongoose.model("buttons", buttonSchema);

Ответы [ 2 ]

1 голос
/ 17 января 2020

Вы можете использовать findByIdAndUpdate, только если хотите обновить документ, сопоставив _id документа

Если вы хотите сопоставить документ с любым другим свойством (например, name в ваш случай), вы можете использовать findOneAndUpdate

Напишите ваш запрос следующим образом

router.put('/:name', function(req,res,next) {
    Buttons.findOneAndUpdate({name: req.params.name},         
 req.body).then(function(){
    Buttons.findOne({name: req.params.name}).then(function(buttons){
        res.send(buttons);
    });
});
 });

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

0 голосов
/ 17 января 2020

Пожалуйста, добавьте также свой идентификатор, который вы должны обновить в вашей базе данных

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...

Эта ошибка возникает, потому что findByIdAndUpdate нужен идентификатор объекта, который мы хотим обновить, чтобы он отображал ошибку ObjectId. поэтому передайте свой идентификатор из внешнего интерфейса и используйте его в своем внутреннем интерфейсе для обновления данных частиц.

шаг 1: вы можете создать новую конечную точку для имени обновления

router.put('/update-name', function(req,res,next) {
  //here you can access req.body data comes from front-end
 // id = req.body.id and name = req.body.name then use it in your 
 Buttons.findByIdAndUpdate(id, { name : name }, {new: true}, function(err, model) {...

}

шаг 2: попробуйте эту конечную точку / имя обновления и передайте ваши данные в Body от почтальона

...