【问题标题】:AJAX won't make "patch" request in Node + ExpressAJAX 不会在 Node + Express 中发出“补丁”请求
【发布时间】:2017-10-22 11:01:44
【问题描述】:

我正在构建一个天气应用程序,该应用程序允许用户通过在向 OpenWeatherMap API 发出 GET 请求的输入中输入位置来登录并获取特定城市的天气。我已经内置了一个功能,允许用户将他们查找的位置设置为他们的主页天气。我的理由是在用户模型中分配一个名为“位置”的属性,并在用户单击“设置为主页天气”时更新它。我正在尝试使用 AJAX 发出补丁请求,但即使在请求上触发了成功函数,模型也不会更新。

这是我的 AJAX 请求:

var userId = $('.set-weather').attr('data-id')
$(document).on('click', '.location-btn', function(){
    console.log(setLocation)
    var data = {
        location: setLocation
    }
    console.log("/users/" + userId)
    $.ajax({
      url: '/users/' + userId,
      method: 'patch',
      dataType: "json",
      data: ({location: data}),
      success: function(result){
        console.log("Success")
      },
      error: function(result){
        console.log("failure")
      }
    })
  })

这是使用 Node 和 Express 的用户模型:

// app/models/user.js
// load the things we need
var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');

// define the schema for our user model
var userSchema = mongoose.Schema({


    email        : String,
    password     : String,
    location     : String,


});

// methods 
// generating a hash
userSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

// checking if password is valid
userSchema.methods.validPassword = function(password) {
return bcrypt.compareSync(password, this.password);
};

// create the model for users and expose it to our app
module.exports = mongoose.model('User', userSchema);

到用户 API 的路由:

router.route('/users/:id')
  .get(userController.show)
  .patch(userController.update)

以及控制器中的Update方法:

controller.update = function(req, res){
  var id = req.params.id;
  var location = req.params.location;
  User.findOneAndUpdate(
    {_id: id},
    {
      location: location
    },
    function(err, user){
      if(err){
        throw err;
      }
      res.json(user)
    }
    )
}

【问题讨论】:

    标签: node.js ajax mongodb express model-view-controller


    【解决方案1】:

    更新你的控制器更新方法

    像这样:

    controller.update = function(req, res){
      var id = req.params.id;
      var location = req.body.location;
      User.findOneAndUpdate(
        {_id: id},
        {
          location: location
        },
        function(err, user){
          if(err){
            throw err;
          }
          res.json(user)
        }
        )
    }
    

    基本上问题是您将 id 作为 url 参数发送,但在补丁方法中发送位置,因此它将在 req.body 而不是 req.params 中可用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2014-04-20
      • 2013-11-16
      相关资源
      最近更新 更多