NodeJS Express Angular 2应用程序

时间:2018-04-10 19:13:17

标签: node.js express http-delete http-put

我有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,我得出结论,从前端调用服务方法updatedelete,但从不调用REST端点(在server.js中)。根本没有错误消息。

可能是什么问题?

编辑:除了PUT方法之外,DELETE也没有被调用。我编辑了标题和问题。另外,我在console.logupdate方法中添加了delete,因此我可以查看正在调用的网址,并且它是http://localhost:8000/api/lessons/2(例如),所以它是正确。我已经尝试通过Postman为PUT和DELETE调用该URL,并且它正常工作,它更改或删除了DB中的相关条目。因此,在我看来,唯一的问题是前端和后端之间缺乏沟通。

1 个答案:

答案 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部分添加一些东西,这样就可以了。)