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

Javascript mean.io$save()未找到返回的404文件,javascript,angularjs,node.js,mongoose,mean.io,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:

我使用的是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
}});
所以我有两个基本的答案。一个是单元,另一个是包含对单元集合的引用的材质。 这是材质的管线文件

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);
};
我想下一个逻辑条目是服务器端控制器的create函数

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操作的服务设置,但这是一个发布,所以…就是这样。这是客户端控制器。 加载网页时会调用第一个代码段。它基本上设置了$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>

计量单位
交货抵销
两天前
一天前
当天
添加

任何关于我做错了什么的帮助或想法都将不胜感激。正如我之前所说的,我还有其他工作刚刚找到的非常相似的列表

找到了问题的答案。我认为这是我的一个错误。只是不知道具体在哪里。它位于服务器端控制器中

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);
      });
    }
});
现在它按预期工作。生成的数据库条目如下所示

{“_id”:ObjectId(“5524547488842d6cb408c003”),“名称”:“测试”,“单元”:ObjectId(“550f7047e9cc68da538fe46f”),“交货补偿”:“当天”}


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

对不起……shouda还提供了有关问题的更多详细信息。当我尝试添加时,我在浏览器中得到一个POST 404(未找到)响应。我在调试模式下使用gulp和node,它也在解析器中吐出POST/aterials 404。如果我在浏览器中打开,我会得到一个很好的响应,其中包含了我收集的资料中的数据。