【发布时间】:2015-06-15 16:05:41
【问题描述】:
我正在使用 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。一个是 Units,另一个是 Materials,其中包含对 Units 集合的引用。 这是材质的路由文件。
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,所以……就是这样。这是客户端控制器。 第一个 sn-p get 在网页加载时调用。它基本上设置了 $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()));
}
});
});
};
下一个 sn-p 是客户端控制器中的 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>
任何关于我做错了什么的帮助或想法将不胜感激。正如我之前所说,我还有其他一些非常相似的列表,可以找到。
【问题讨论】:
-
对不起...shouda 还提供了有关该问题的更多详细信息。当我尝试添加时,我在浏览器中收到 POST localhost:3000/materials 404 (Not Found) 响应。我在调试模式下使用带有节点的 gulp,它也在解析器中吐出 POST /aterials 404。如果我在浏览器中访问localhost:3000/materials,我会从我的材料收集中得到很好的响应。
标签: javascript angularjs node.js mongoose mean.io