【发布时间】:2018-07-30 20:08:20
【问题描述】:
我有一个 nodejs 作为后端服务,Angular 5 作为前端,我想调用一个 POST 方法到 NodeJS 服务器,发送一个 Blob 文件到服务器。
但是那个 post 方法被执行了,后端控制台日志上什么也没有显示。
这里有一些代码片段:
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';
})
在 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"} "object" "http://localhost:3000/decrypt"
我想让nodejs Server把这个post方法和Blob(GPG文件)对象作为参数,做点什么。
但是看起来后端服务器没有打印出任何东西。
请告知如何修改此代码,我应该使用 POST 还是 PUT?我想将 GPG 文件传递给 nodeJS 服务器并对其进行解密。
谢谢,
【问题讨论】:
-
日志中的错误是什么?您是否收到 400 或 404 作为您请求的网络状态?也可能要考虑使用代理。 github.com/angular/angular-cli/blob/master/docs/documentation/…
标签: javascript node.js ajax angular angular5