我有Express后端这个应用程序:
server.js
:
var express = require('express');
var methodOverride = require('method-override')
var app = express();
var bodyParser = require('body-parser');
var cors = require('cors');
var mysql = require('mysql');
...
app.use(methodOverride('X-HTTP-Method-Override'))
app.use(bodyParser.json());
app.use(cors());
...
app.route('/api/lessons').get((req, res) => {
con.query('SELECT * FROM lesson', (err, rows) => {
if (err)
res.send(JSON.stringify({ "status": 500, "error": err, "response": null }));
else
res.send(JSON.stringify({ "status": 200, "error": null, "response": rows }));
});
});
...
app.route('/api/lessons/:lessonId').put(function (req, res) {
console.log("Backend PUT");
var lessonId = req.param('lessonId');
con.query('UPDATE lesson SET title=?, body=?, level_id=? WHERE id=?', [req.body.title, req.body.body, req.body.level_id, lessonId], (err, rows) => {
if (err)
res.send(JSON.stringify({ "status": 500, "error": err, "response": null }));
else
res.send(JSON.stringify({ "status": 200, "error": null, "response": rows }));
});
});
...
app.route('/api/lessons/:lessonId').delete((req, res) => {
console.log("Backend DELETE");
var lessonId = req.param('lessonId');
con.query('DELETE FROM lesson WHERE id=?', [lessonId], (err, rows) => {
if (err)
res.send(JSON.stringify({ "status": 500, "error": err, "response": null }));
else
res.send(JSON.stringify({ "status": 200, "error": null, "response": rows }));
});
});
角度服务:
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { Configuration } from '../../app.constants';
@Injectable()
export class LessonService {
private restUrl: string;
constructor(private http: HttpClient) {
this.restUrl = 'http://localhost:8000/api/lessons/';
}
public getAll() {
return this.http.get(this.restUrl);
}
public getOne(id: number) {
return this.http.get(this.restUrl + id);
}
public getAllForLevel(id: number) {
return this.http.get('http://localhost:8000/api/lessons-for-level/' + id);
}
...
public update(id: number, level: any) {
console.log(this.restUrl+id);
return this.http.put(this.restUrl + id, level);
}
public delete(id: number) {
console.log("DELETE: " + this.restUrl + id);
return this.http.delete(this.restUrl + id);
}
...
}
所有GET方法都正常工作,但不是PUT或DELETE方法。使用console.log
,我得出结论,从前端调用服务方法update
和delete
,但从不调用REST端点(在server.js
中)。根本没有错误消息。
可能是什么问题?
编辑:除了PUT方法之外,DELETE也没有被调用。我编辑了标题和问题。另外,我在console.log
和update
方法中添加了delete
,因此我可以查看正在调用的网址,并且它是http://localhost:8000/api/lessons/2
(例如),所以它是正确。我已经尝试通过Postman为PUT和DELETE调用该URL,并且它正常工作,它更改或删除了DB中的相关条目。因此,在我看来,唯一的问题是前端和后端之间缺乏沟通。
答案 0 :(得分:1)
我找到了解决方案。
<强> TL; DR:强>
我没有将.subscribe
放在我调用update
方法的地方。
长版:
当我从我的服务中调用各种get
方法时,我这样做:
this.lessonService.getAllForLevel(this.levelId).subscribe(data => this.lessons = data['response']);
但是,我认为我可以这样调用我的update
方法:
this.lessonService.update(this.lessonId, this.lesson);
...因为我认为没有什么有意思的我应该订阅。
但是,当我将呼叫改为此时:
this.lessonService.update(this.lessonId, this.lesson).subscribe(data => console.dir(data));
......它工作正常(不要介意console.dir
部分,我只是想在subscribe
部分添加一些东西,这样就可以了。)