(猫鼬)put方法不起作用

时间:2018-06-24 06:13:29

标签: node.js express mongoose

我正在使用猫鼬创建Web API。

POST和GET工作,但是我不知道如何在猫鼬中实现PUT方法。

这是我创建的:

board.js

const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const config = require('../config/database');

const BoardSchema = mongoose.Schema({
    _id: {
        type: String
    },
    position: {
        type: [String]
    }
});

const Board = module.exports = mongoose.model('boards', BoardSchema);

module.exports.getBoardById = function (id, callback)
{
    Board.findById(id, callback);
}

module.exports.addBoard = function (newBoard, callback)
{
    newBoard.save(callback);
}

module.exports.updateBoard = function (newBoard, callback)
{
    newBoard.save(callback);
}

users.js

router.put('/board/:id', (req, res, next) =>
{
    let newBoard = new Board({
        _id: req.params.id,
        position: req.body.position
    });

    Board.updateBoard(newBoard, (err, board) =>
    {
        if (err)
        {
            res.json({ newBoard: newBoard, success: false, msg: "Failed to update board" });
        }
        else
        {
            res.json({ newBoard: newBoard, success: true, msg: "Board added" });
        }
    });
});;

在这里,我在board.js中创建了添加新板并更新到现有板的方法。 .addBoard可以正常工作,并且可以使用Postman进行测试。但是,.updateBoard在数据不存在时添加数据,但不更新任何数据,并作为响应返回false(就像POST一样)。有什么办法可以使PUT方法起作用?

谢谢!

3 个答案:

答案 0 :(得分:1)

为什么在更新时使用保存方法?

const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const config = require('../config/database');

const BoardSchema = mongoose.Schema({
    _id: {
        type: String
    },
    position: {
        type: [String]
    }
});

const Board = module.exports = mongoose.model('boards', BoardSchema);

module.exports.getBoardById = function (id, callback)
{
    Board.findById(id, callback);
}

module.exports.addBoard = function (newBoard, callback)
{
    newBoard.save(callback);
}

module.exports.updateBoard = function (condition, update, callback)
{
    Board.update(condition,update,callback);
}

在控制器中

router.put('/board/:id', (req, res, next) =>
{
    let newBoard = new Board({
        _id: req.params.id,
        position: req.body.position
    });

    Board.updateBoard({ _id: req.params.id } ,newBoard, (err, board) =>
    {
        if (err)
        {
            res.json({ newBoard: newBoard, success: false, msg: "Failed to update board" });
        }
        else
        {
            res.json({ newBoard: newBoard, success: true, msg: "Board added" });
        }
    });
});

尝试一下。

答案 1 :(得分:1)

请告诉我这是否适合您!我想向您介绍http://mongoosejs.com/docs/api.html#findbyidandupdate_findByIdAndUpdate

router.put('/board/:id', (req, res) => {
  const {id: _id} = req.params // Assigning id to _id which is a es6 feature. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
  const {position} = req.body

  const newBoard = {
    _id,
    position
  }

  Board.findByIdAndUpdate(
    _id,
    newBoard,
    (err, updatedBoard) => {
      if (err) {
        res.json({
          newBoard,
          success: false,
          msg: 'Failed to update board'
        })
      } else {
        res.json({newBoard, success: true, msg: 'Board added'})
      }
    }
  )
})

答案 2 :(得分:0)

当您使用req.body时,我认为您正在尝试从表单中调用放置请求(有时也会发生AJAX请求)。为此,请使用method-overide。并按照文档中的说明设置xhr标头。这肯定会工作。