Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将req.body属性复制到Mongoose模型时出错_Javascript_Angularjs_Node.js_Express_Mongoose - Fatal编程技术网

Javascript 将req.body属性复制到Mongoose模型时出错

Javascript 将req.body属性复制到Mongoose模型时出错,javascript,angularjs,node.js,express,mongoose,Javascript,Angularjs,Node.js,Express,Mongoose,首先,我必须说我是角度和节点技术方面的新手。很抱歉我的无知 当我尝试从版本视图保存实体时,出现此错误:“在路径“category”处,值“[object object]”的转换到ObjectId失败 我有以下代码: HTML: $scope.update = function() { var notification = $scope.notification; notification.$update(function() { $location.path('notifica

首先,我必须说我是角度和节点技术方面的新手。很抱歉我的无知

当我尝试从版本视图保存实体时,出现此错误:“在路径“category”处,值“[object object]”的转换到ObjectId失败

我有以下代码:

HTML:

$scope.update = function() {
  var notification = $scope.notification;

  notification.$update(function() {
    $location.path('notifications/' + notification._id);
  }, function(errorResponse) {
    $scope.error = errorResponse.data.message;
  });
};
var mongoose = require('mongoose'),
    errorHandler = require('./errors.server.controller'),
    Notification = mongoose.model('Notification'),
    _ = require('lodash');

exports.update = function(req, res) {
  var notification = req.notification;
  notification = _.extend(notification , req.body);

  notification.save(function(err) {
    if (err) {
      return res.status(400).send({
        message: errorHandler.getErrorMessage(err)
      });
    } else {
      res.jsonp(notification);
    }
  });
};
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var NotificationSchema = new Schema({
  name: {
    type: String,
    default: '',
    required: 'Rellena la notificación',
    trim: true
  },
  created: {
    type: Date,
    default: Date.now
  },
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  },
  category: {
    type: Schema.ObjectId,
    ref: 'Category'
  }
});
mongoose.model('Notification', NotificationSchema);

var CategorySchema = new Schema({
  name: {
    type: String,
    default: '',
    required: 'Rellena la categoría',
    trim: true
  },
  created: {
    type: Date,
    default: Date.now
  },
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  }
});
mongoose.model('Category', CategorySchema);

类别:
描述

`
角度控制器:

$scope.update = function() {
  var notification = $scope.notification;

  notification.$update(function() {
    $location.path('notifications/' + notification._id);
  }, function(errorResponse) {
    $scope.error = errorResponse.data.message;
  });
};
var mongoose = require('mongoose'),
    errorHandler = require('./errors.server.controller'),
    Notification = mongoose.model('Notification'),
    _ = require('lodash');

exports.update = function(req, res) {
  var notification = req.notification;
  notification = _.extend(notification , req.body);

  notification.save(function(err) {
    if (err) {
      return res.status(400).send({
        message: errorHandler.getErrorMessage(err)
      });
    } else {
      res.jsonp(notification);
    }
  });
};
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var NotificationSchema = new Schema({
  name: {
    type: String,
    default: '',
    required: 'Rellena la notificación',
    trim: true
  },
  created: {
    type: Date,
    default: Date.now
  },
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  },
  category: {
    type: Schema.ObjectId,
    ref: 'Category'
  }
});
mongoose.model('Notification', NotificationSchema);

var CategorySchema = new Schema({
  name: {
    type: String,
    default: '',
    required: 'Rellena la categoría',
    trim: true
  },
  created: {
    type: Date,
    default: Date.now
  },
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  }
});
mongoose.model('Category', CategorySchema);
服务器端控制器:

$scope.update = function() {
  var notification = $scope.notification;

  notification.$update(function() {
    $location.path('notifications/' + notification._id);
  }, function(errorResponse) {
    $scope.error = errorResponse.data.message;
  });
};
var mongoose = require('mongoose'),
    errorHandler = require('./errors.server.controller'),
    Notification = mongoose.model('Notification'),
    _ = require('lodash');

exports.update = function(req, res) {
  var notification = req.notification;
  notification = _.extend(notification , req.body);

  notification.save(function(err) {
    if (err) {
      return res.status(400).send({
        message: errorHandler.getErrorMessage(err)
      });
    } else {
      res.jsonp(notification);
    }
  });
};
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var NotificationSchema = new Schema({
  name: {
    type: String,
    default: '',
    required: 'Rellena la notificación',
    trim: true
  },
  created: {
    type: Date,
    default: Date.now
  },
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  },
  category: {
    type: Schema.ObjectId,
    ref: 'Category'
  }
});
mongoose.model('Notification', NotificationSchema);

var CategorySchema = new Schema({
  name: {
    type: String,
    default: '',
    required: 'Rellena la categoría',
    trim: true
  },
  created: {
    type: Date,
    default: Date.now
  },
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  }
});
mongoose.model('Category', CategorySchema);
猫鼬模型:

$scope.update = function() {
  var notification = $scope.notification;

  notification.$update(function() {
    $location.path('notifications/' + notification._id);
  }, function(errorResponse) {
    $scope.error = errorResponse.data.message;
  });
};
var mongoose = require('mongoose'),
    errorHandler = require('./errors.server.controller'),
    Notification = mongoose.model('Notification'),
    _ = require('lodash');

exports.update = function(req, res) {
  var notification = req.notification;
  notification = _.extend(notification , req.body);

  notification.save(function(err) {
    if (err) {
      return res.status(400).send({
        message: errorHandler.getErrorMessage(err)
      });
    } else {
      res.jsonp(notification);
    }
  });
};
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var NotificationSchema = new Schema({
  name: {
    type: String,
    default: '',
    required: 'Rellena la notificación',
    trim: true
  },
  created: {
    type: Date,
    default: Date.now
  },
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  },
  category: {
    type: Schema.ObjectId,
    ref: 'Category'
  }
});
mongoose.model('Notification', NotificationSchema);

var CategorySchema = new Schema({
  name: {
    type: String,
    default: '',
    required: 'Rellena la categoría',
    trim: true
  },
  created: {
    type: Date,
    default: Date.now
  },
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  }
});
mongoose.model('Category', CategorySchema);
因此,如果我使用WebStorm在更新方法中调试服务器控制器内部,我可以看到req.body具有格式良好的每个属性,但在将req.body转换为通知Mongoose模型后,使用:

notification = _.extend(notification , req.body);
category属性不是一个模型,而是一个ObjectId。对于复杂属性,lodash.extend似乎无法正常工作。我尝试过许多其他方法来克隆这个对象,但都没有成功

最后我解决了这个问题,在角度控制器中有一行:

  notification.category = $scope.notification.category._id;

  notification.$update(function() {
无论如何,我认为这不是正确的方法。我想一定有一种方法可以将req.body属性复制到mongoose模型中,而不必手动执行复杂属性


提前多谢

由于您正在使用AngularJS和ExpressJS,我建议您使用该服务,该服务正好用于与rest API交互

**$resource**
包含以下默认操作集:

{ 'get':    {method:'GET'},
  'save':   {method:'POST'},
  'query':  {method:'GET', isArray:true},
  'remove': {method:'DELETE'},
  'delete': {method:'DELETE'} };
我在上面分享的链接中提供了很好的文档

就你而言: 我想,
http://localhost:300/notifications/:id
,这可能是您要执行更新操作的rest url

您可以创建自定义服务,如:

var module = angular.module('myapp.services',['ngResource']);

module.factory('MyAppUpdateService',function($resource){
    return $resource('notifications/:id', 
    {
        id: '@id'
    },
    {
        'update': { method:'PUT' }
    }
);
});
现在,在angular应用程序控制器中,您可以将此服务作为依赖项注入,因此可以在REST url中执行更新

angular.module('myapp',['ngResource','myapp.services']);
angular.module('myapp').controller('MeetupsController',['$scope','$resource','$state','$location','MeetupUpdateService','socket',
                                                          function($scope,$resource,$state,$location, MyAppUpdateService){

$scope.updateMeetup = function(){
                $scope.updateService = new MyAppUpdateService();
                $scope.updateService.name = $scope.notification.name;
                .
                .
                .
$scope.updateService.$update({id:$scope.notification.category._id},function(result){  
                    $location.path("/meetup/")
                });
            }

})]);
如果您想要更全面的实现,那么这只是一个示例。听着,我正在创造一颗属于我自己的种子,我也在做同样的事情。 如有疑问,请务必询问