【问题标题】:In angularjs 1.0.8 not works PUT rest service在 angularjs 1.0.8 中不起作用 PUT 休息服务
【发布时间】:2013-11-29 21:39:51
【问题描述】:

我有具有 CRUD Rest 服务的 angularjs 应用程序。创建、读取和删除方法效果很好,但 PUT 无效。 我在 Stackoverflow 上发现,接受的答案也存在同样的问题,例如:

Angular JS: Full example of GET/POST/DELETE/PUT client for a REST/CRUD backend?

AngularJS - PUT method not working (404 error)

所以我在这个答案中这样做,但我的更新(通过 PUT 方法)不起作用(状态代码:404 'Cannot PUT /api/adverts')。 也许人们注意到我的代码中的某些内容。一件重要的事情是我使用 angular 1.0.8

services.js (angularjs):

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

motoAdsServices.factory('Advert', ['$resource', function($resource) {
    return $resource('/api/adverts/:advertId', {}, {
       update: {method:'PUT', params: {advertId: '@advertId'}}
    });
  }]);

editAdvert.html

  <label class="control-label">Brand</label>
  <div class="controls">
    <select name="brand" ng-model="editAdvert.brand" required ng-options="b.name for b in brands">
      <option value=""></option>
    </select>
  </div>

  <label class="control-label">Model</label>
  <div class="controls">
    <select name="model" ng-model="editAdvert.model" required ng-options="m.name for m in editAdvert.brand.models">
      <option value=""></option>
    </select>
  </div>

controllers.js(angular.js - 我没有删除重要的代码):

$scope.updateAdvert = function() {
  var editAdvert = {
    _id: $scope.editAdvert._id,
    brandName: $scope.editAdvert.brand.name,
    modelName: $scope.editAdvert.model.name,
    year: $scope.editAdvert.year,
    price: $scope.editAdvert.price,
    imageUrl: $scope.editAdvert.imageUrl,
    countryName: $scope.editAdvert.country.name,
    regionName: $scope.editAdvert.region.name
  };

  // !!! I TRY THIS TO FIX !!!
  $scope.advertId = $scope.editAdvert._id;

  // !!! THIS NOT WORKS STILL !!!
  Advert.update(editAdvert, function() {
    previousAdvert = angular.copy($scope.editAdvert);
    alert('Advert updated');
  });
};

server.js (nodejs):

var express = require('express');
var path = require('path');
var http = require('http');
var adverts = require('./routes/adverts');

var app = express();

app.configure(function() {
  app.set('port', process.env.PORT || 3000);
  app.use(express.logger('dev'));  /* 'default', 'short', 'tiny', 'dev' */
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.static(path.join(__dirname, 'public')));
});

app.get('/api/adverts', adverts.findAll);
app.get('/api/adverts/:id', adverts.findById);
app.post('/api/adverts', adverts.add);
app.put('/api/adverts/:id', adverts.update);
app.delete('/api/adverts/:id', adverts.remove);

http.createServer(app).listen(app.get('port'), function() {
  console.log("Express server listening on port " + app.get('port'));
});

作为回应,我得到 404 和“无法放置 /api/adverts”。 我几乎确信这是 URL 末尾缺少“_id”的问题。 看图片:

请查看我的代码并提出一些建议。

【问题讨论】:

    标签: javascript node.js rest angularjs express


    【解决方案1】:

    我在这里看到了一些不一致的地方。首先,update 应该是实例方法。所以调用应该是这样的:$scope.editAdvert.$update(... 而不是Advert.update($scope.editAdvert...

    这里的另一件事是参数名称的不同。指示资源,资源的id应为advertId,而如图所示,对象的id名为_id

    最后,你正在设置$scope.advertId = $scope.editAdvert._id; ...正如你所说的那样修复它。问题是,它与对象$scope.editAdvert 无关……它只是$scope 的另一个对象。资源没有意识到这一点。

    查看有关ngResource here的更多详细信息

    【讨论】:

    • 谢谢! 1. update 不是实例方法,因为我放入Advert.updatevar editAdvert(它有brandName 简单字符串)不是$scope.editAdvert(我有brand 复杂对象)。我在 editAdvert.html 中使用 $scope.Advert 来处理 select(请参阅代码 - 我已更新以向您展示)。 2. 这是完美的建议,我将代码更改为update: {method:'PUT', params: {advertId: '@_id'}},它可以工作! 3. 我删除了我的修复。如果您可以查看我更新的代码controllers.jseditAdvert.html 并立即检查不一致之处。
    • 当然FIX行被删除了,我在services.js中改了update: {method:'PUT', params: {advertId: '@_id'}}
    • 很高兴看到这一点 ;) 享受 Angular
    猜你喜欢
    • 2013-05-08
    • 2017-02-09
    • 2012-06-29
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多