我正在寻求Angular社区的一些智慧。我正在使用MEAN堆栈处理一个简单的项目。我已经设置了我的后端api,一切都按预期工作。使用Postman,我观察到GET和PUT路由的预期行为,以检索/更新单个值 - 一个高分 - 它在MongoDB的自己的集合中保存在它自己的文档中。到目前为止一切都很好。
当事情偏离轨道时,尝试从Angular中访问PUT api端点。访问GET端点没有问题,检索和显示数据工作顺利。但是,经过大量阅读和搜索后,我无法正确访问PUT端点并在游戏玩法触发该事件时更新高分数据。以下是我认为相关的代码片段。
后端代码:
SCHEMA:
const _scoreSchema = {
name: { type: String, required: true },
value: { type: Number, "default": 0 }
};
途径:
router
.route('/api/score/:highScore')
.put(scoreController.setHighScore);
控制器:
static setHighScore(req, res) {
scoreDAO
.setHighScore(req.params.highScore)
.then(highScore => res.status(200).json(highScore))
.catch(error => res.status(400).json(error));
}
DAO:
scoreSchema.statics.setHighScore = (value) => {
return new Promise((resolve, reject) => {
score
.findOneAndUpdate(
{"name": "highScore"},
{$set: {"value": value} }
)
.exec(function(err, response) {
err ? reject(err)
: resolve(response);
});
});
}
角色代码:
控制器:
private _updateHighScore(newHighScore): void {
console.log('score to be updated to:', newHighScore)
this._gameService
.updateHighScore(newHighScore);
}
SERVICE:
updateHighScore(newHighScore: Number): Observable<any> {
console.log(newHighScore);
let url = '/api/score/' + newHighScore;
let _scoreStringified = JSON.stringify({value: newHighScore});
let headers = new Headers();
headers.append("Content-Type", "application/json");
return this._http
.put(url , _scoreStringified, {headers})
.map((r) => r.json());
}
请注意,上面最后一段代码中的console.log(newHighScore)正确打印了要更新的新高分的值,它只是没有写入数据库。
以角度为单位的PUT路由的概念性问题是:如果api已经设置为接收成功更新数据库所需的所有信息(通过路由参数),为什么需要提供在Angular .put()函数中再次提供所有这些信息?这似乎重新发明了轮子并没有真正利用已经创建的健壮的api端点。换句话说,在深入研究文档之前,我天真地期待像.put(url)这样的东西是调用api所需的全部内容,那么我逻辑中缺少的链接是什么?
谢谢!