我使用的是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>
对于我做错的任何帮助或想法将不胜感激。正如我之前所说的那样,我还有其他非常相似的列表。
答案 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; }
我能够找到并解决问题,但我有点不清楚它为什么会起作用。