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,我得出结论,服务方法 updatedelete 是从前端调用的,但 REST 端点(在 server.js 中)从未被调用。完全没有错误信息。

可能是什么问题?

Edits:除了 PUT 方法外,DELETE 也没有被调用。我编辑了标题和问题。此外,我在 updatedelete 方法中添加了 console.logs,因此我可以检查正在调用什么 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 部分添加一些东西以便它可以工作)。