简体   繁体   中英

Angular 5 http post method not called in nodejs

I have a nodejs as Backend Service and angular 5 as front end, I want to call a POST method to NodeJS Server, send a Blob File to server.

But that post method is executed, and nothing shown on backend console log.

Here are some code piece:

server.js

const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
const bodyParser = require('body-parser');
const cors = require('cors');
app.use(cors());
//create a cors middleware
app.use(function (req, res, next) {
  //set headers to allow cross origin request.
  res.header("Access-Control-Allow-Origin", "*");
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
app.post('/decrypt', function (req, res) {
  console.log("decrypt called");
  return 'data back';
})

And in AngularJS: database.services.ts:

import { Injectable, Input } from '@angular/core';
import { Http, Response, ResponseContentType } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
import { Observable } from 'rxjs/Observable';
import { saveAs, FileSaver } from 'file-saver/FileSaver';
import { HttpClientModule, HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';

@Injectable()
export class DatabaseService {

  private API_GET_LIST_FILES = 'http://localhost:3000/files';

  private BASE_URL = 'http://localhost:3000/';

  private API_GET_FILE = 'http://localhost:3000/download?name=';

  constructor(private http: Http) { }

  getFile(key: string) {
    return this.http.get(this.API_GET_FILE + key, {
      responseType: ResponseContentType.Blob
    })
      .map(res => {
        return {
          filename: key.split('/').pop(),
          data: res.blob()
        };
      })
      .subscribe(res => {
        this.decryptFile(res.data);
        saveAs(res.data, res.filename);
      }, error => {
        console.log('download error:', JSON.stringify(error));
      }, () => {
        console.log('Completed file download.');
      })
  }

  decryptFile(data: any): Observable<any> {
    const httpOptions = {
      Headers: new HttpHeaders({
        'Content-Type': 'application/octet-stream',
        'data': data
      })
    };
    console.log(data, typeof data, this.BASE_URL + `decrypt`);
    return this.http.post(`http://localhost:3000/decrypt`, httpOptions);
  }
}

This getFile function will be called once I click the file download button on page, because in the browser console, it will print out the Blob(564534) {size: 564534, type: "application/octet-stream"} "object" "http://localhost:3000/decrypt"

I want the nodejs Server to take this post method and the Blob (GPG file) object as a parameter, and do something.

But looks like the backend server didn't print out anything.

Please advise how to modify this code, should I use POST or PUT? I want to pass a GPG file to nodeJS server and decrypt it.

Thanks,

decryptFile returns Observable , you must subscribe to it to execute the http call:

this.decryptFile(res.data).subscribe(decrypted => {???});


Edit: Could not resist, a few observations, feel free to ignore:

  • Why do you get a file from server and then send it back there? Why don't you just decrypt the file during the first API call and return that?
  • From security point of view... nevermind, I just hope there will be some authorization on the server as you are dealing with PGP files...
  • You should preferably start using HttpClient from @angular/common/http instead of Http . Good news is you have that imported already.
  • Depending on the size of the files you might want to consider using http upload instead of POST. Still, see the first point.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM