PUT 和 DELETE 方法未在 NodeJS Express Angular 2 应用程序中调用
PUT and DELETE methods not called in NodeJS Express Angular 2 app
我有这个带有 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 }));
});
});
Angular 服务:
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
中)从未被调用。完全没有错误信息。
可能是什么问题?
Edits:除了 PUT 方法外,DELETE 也没有被调用。我编辑了标题和问题。此外,我在 update
和 delete
方法中添加了 console.log
s,因此我可以检查正在调用什么 URL,它是 http://localhost:8000/api/lessons/2
(例如), 所以它是正确的。我已经尝试通过 Postman 为 PUT 和 DELETE 调用 URL 并且它工作正常,它更改或删除了数据库中的相关条目。所以在我看来,唯一的问题是前端和后端之间缺乏通信。
我找到了解决方案。
tl;博士:
我没有把.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
部分添加一些东西以便它可以工作)。
我有这个带有 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 }));
});
});
Angular 服务:
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
中)从未被调用。完全没有错误信息。
可能是什么问题?
Edits:除了 PUT 方法外,DELETE 也没有被调用。我编辑了标题和问题。此外,我在 update
和 delete
方法中添加了 console.log
s,因此我可以检查正在调用什么 URL,它是 http://localhost:8000/api/lessons/2
(例如), 所以它是正确的。我已经尝试通过 Postman 为 PUT 和 DELETE 调用 URL 并且它工作正常,它更改或删除了数据库中的相关条目。所以在我看来,唯一的问题是前端和后端之间缺乏通信。
我找到了解决方案。
tl;博士:
我没有把.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
部分添加一些东西以便它可以工作)。