javascript - Angular 5 http post方法在nodejs中未调用

标签 javascript node.js ajax angular angular5

我有一个nodejs作为后端服务,Angular 5作为前端,我想调用NodeJS服务器的POST方法,向服务器发送一个Blob文件。

但是该 post 方法被执行,后端控制台日志上没有显示任何内容。

以下是一些代码片段:

服务器.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';
})

在 AngularJS 中: 数据库.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);
  }
}

一旦我点击页面上的文件下载按钮,就会调用这个 getFile 函数,因为在浏览器控制台中,它会打印出 Blob(564534) {size: 564534, type: "application/octet-stream “}“对象”“http://localhost:3000/decrypt”

我希望nodejs服务器将这个post方法和Blob(GPG文件)对象作为参数,并执行一些操作。

但看起来后端服务器没有打印出任何内容。

请告知如何修改此代码,我应该使用 POST 还是 PUT?我想将 GPG 文件传递​​到 nodeJS 服务器并解密它。

谢谢

最佳答案

decryptFile 返回 Observable,您必须订阅它才能执行 http 调用:

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

<小时/>

编辑:无法抗拒,一些观察结果,请随意忽略:

  • 为什么要从服务器获取文件然后将其发送回服务器?为什么不在第一次 API 调用期间解密文件并返回该文件?
  • 从安全 Angular 来看...没关系,我只是希望在处理 PGP 文件时服务器上有一些授权...
  • 您最好开始使用 @angular/common/http 中的 HttpClient,而不是 Http。好消息是您已经导入了。
  • 根据文件的大小,您可能需要考虑使用 http 上传而不是 POST。不过,请参阅第一点。

关于javascript - Angular 5 http post方法在nodejs中未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51601566/

相关文章:

javascript - 使用 ID 或 "relative paths"连接到 JS 函数的链接更好吗?

javascript - 如何使用 JavaScript 为另一个域设置 cookie?

javascript - 如何在 Express 中代理外部站点

javascript - slider 图像上的淡入和淡出

Javascript 下载字符串

javascript - WebRTC 数据通道服务器到客户端的 UDP 通信。目前可能吗?

node.js - 保持 super 测试直到 API 初始化

php - 从数据库中删除行之前添加警报窗口

php - 如何获取按钮以在 jQuery 确认对话框上执行操作?

javascript - 数据返回但无法在 jquery ajax 中发布