mean.io $ save()返回404文件未找到

时间:2015-04-10 03:38:40

标签: javascript angularjs node.js mongoose mean.io

我使用的是mean.io,并且遇到了一个我不太了解的数据库集合问题。我有几个与此类似的列表,它们工作正常。当我尝试将一个项目添加到材料列表时,我从服务器端获得404响应,我不知道为什么。

所以......让我先从一点代码转储开始。

以下是模型文件条目

var UnitSchema = new Schema({
unit: {
    type: String,
    required: true
}});

和...

var MaterialSchema = new Schema({
name: {
    type: String,
    required: true
},
unit: {
    type: mongoose.Schema.ObjectId,
    ref: 'Unit'
},
delivery_offset: {
    type: String,
    required: true
}});

所以我有两个基本的shemas。一个是单位,另一个是材料,其中包含对单位集合的引用。 这是材料的路径文件。

module.exports = function(Materials, app, auth, database) {
  //Setting up the materials api
  app.get('/materials', auth.requiresAdmin, materials.all);
  app.post('/materials', auth.requiresAdmin, materials.create);
  app.get('/materials/:materialId', auth.requiresAdmin, materials.show);
  app.put('/materials/:materialId', auth.requiresAdmin, materials.update);
  app.delete('/materials/:materialId', auth.requiresAdmin, materials.destroy);

  app.param('materialId', materials.material);
};

我认为下一个逻辑条目是服务器端控制器的创建功能。

exports.create = function(req, res, next, id) {
  var material = new Material(req.body);
  material.save(function(err) {
    if (err) {
        return res.status(500).json({
            error: 'Cannot save the material of measure'
        });
    }
    res.json(material);
  });
};

这就是服务器端的东西。现在这是客户端。在我发布之前,我确实为PUT操作设置了服务,但这是一个POST,所以......就是这样。这是客户端控制器。 在网页加载时调用此第一个代码段。它基本上设置了$ scope变量和ngTable。

$scope.init = function() {
        Materials.query({}, function(materials) {

            $scope.materials = materials;
            $scope.units = Units.query();

            var data = materials;

            $scope.tableMaterialsParams = new NGTableParams({
                page: 1,
                count: 10
            },{
                total: data.length,
                getData: function($defer, params) {
                    params.total(data.length);
                    var orderedData = params.sorting()?$filter('orderBy')(data, params.orderBy()):data;
                    $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
                }
            });
        });        
    };

下一个片段是客户端控制器中的add函数,当用户想要将新材料添加到列表时,它会被调用。

    $scope.addMaterial = function() {
        if (!$scope.materials) $scope.materials = [];

        var material = new Materials({
            name: $scope.name,
            unit: $scope.unit._id,
            delivery_offset: $scope.delivery_offset
        });

        material.$save(function(response) {
            $scope.materials.push(response);

            var data = $scope.materials;
            $scope.tableMaterialsParams.total(data.length);
            $scope.tableMaterialsParams.reload();
        });

        this.name = this.unit = this.delivery_offset = '';
    };

我正在使用ngTable作为前端显示,这就是为什么你看到一些对tableBlahBlah的调用。它是在保存后更新和刷新表的地方。这是表单的html。

<form id="material-add-form" class="form-group" name="addMaterialForm" data-ng-submit="addMaterial()">
  <div class="row">
    <span class="col-sm-5">
      <input type="text" data-ng-model="name" placeholder="Material Name" class="form-control m-b"/>
    </span>
    <span class="col-sm-2">
      <select ng-model="unit" class="form-control m-b" 
             ng-options="obj.unit for obj in units track by obj._id">
        <option value="" disabled selected>Unit of Measure</option>
      </select>
    </span>
    <span class="col-sm-2">
      <select data-ng-model="delivery_offset" class="form-control m-b">
        <option value="" disabled selected>Delivery Offset</option>
        <option value="Two Days Prior">Two Days Prior</option>
        <option value="One Day Prior">One Day Prior</option>
        <option value="Same Day">Same Day</option>
      </select>
    </span>
    <button class="btn btn-primary " type="submit">
       <i class="fa fa-check"></i>
       Add
    </button>
  </div> 
</form>

对于我做错的任何帮助或想法将不胜感激。正如我之前所说的那样,我还有其他非常相似的列表。

1 个答案:

答案 0 :(得分:0)

找到问题的答案。我认为这是我的错误。只是不确定究竟在哪里。它在服务器端控制器中。

exports.create = function(req, res, next, id)

我仍然相对较新,意思是堆栈开发,所以我不确定为什么这是错误的。我将函数定义更改为

exports.create = function(req, res, next)

它有效!

我的实施还存在第二个问题。这不是问题,因为我从来没有能够使用404错误,因此我从未见过它。当我将材料项目保存到数据库时,单元(ObjectId)将不会填充。这将是空白的。我将save()调用更改为此

material.save(function(err) {
    if (err) {
      return res.json(500, {
        error: 'Cannot save the material'
      });
    } else {
      material.populate({
        path: 'unit',
        select: 'unit'
      }, function(err, doc) {
        res.json(doc);
      });
    }
});

现在它按预期工作。生成的数据库条目类似于

  

{&#34; _id&#34; :ObjectId(&#34; 5524547488842d6cb408c003&#34;),&#34; name&#34; :&#34; TESTING&#34;,&#34; unit&#34; :ObjectId(&#34; 550f7047e9cc68da538fe46f&#34;),&#34; delivery_offset&#34; :&#34;同一天&#34; }

我能够找到并解决问题,但我有点不清楚它为什么会起作用。