node.js - NodeJS 服务器无法从 Angular 检索发布数据
问题描述
我有一个用 NodeJS 编写的后端服务器,它使用 express。
我有最新的 Angular 作为前端,我将数据(GPG 文件)发布到 nodeJS 服务器,我尝试在 NodeJS 代码中获取该数据,并在服务器控制台中将其打印出来,但我得到的只是一个空对象。
我要做的就是将 Blob 数据传递给节点服务器,或者将纯文本传递给节点服务器,然后从节点代码中读取它。
const express = require('express'),
app = express(),
port = process.env.PORT || 3000;
app.listen(port);
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();
});
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.post('/decrypt', (res, req) => {
// Here I try to access the data that I passed by POST method
console.log(res.body);
return 'data back';
})
这是我的角度代码:
import { Injectable, Input } from '@angular/core';
import { HttpClient, HttpResponse, HttpHeaders } from '@angular/common/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
import { Observable } from 'rxjs/Observable';
import { saveAs } from 'file-saver/FileSaver';
@Injectable()
export class DatabaseService {
private API_GET_LIST_FILES = 'http://localhost:3000/files';
private API_GET_FILE = 'http://localhost:3000/download?name=';
private BASE_URL = 'http://localhost:3000/';
constructor(private http: HttpClient) { }
getFile(key: string) {
return this.http.get(this.API_GET_FILE + key, {
responseType: 'blob'
})
.map(res => {
return {
filename: key.split('/').pop(),
data: res
};
})
.subscribe(res => {
console.log('start download:', res);
// no matter what I pass here to the decrypt function, I can't get it in nodeJS server
this.decrypt(res.filename)
.subscribe(
next => console.log(next)
);
saveAs(res.data, res.filename);
}, error => {
console.log('download error:', JSON.stringify(error));
}, () => {
console.log('Completed file download.');
});
}
decrypt(res): Observable<any> {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/octet-stream'
})
};
return this.http.post(this.BASE_URL + 'decrypt', res, httpOptions);
}
}
如果我将 传递***res***
给解密函数,我会得到很多信息,但对我来说看起来很奇怪。
解决方案
按照 Anand 的建议,将 headers 设置为application/json
(或完全跳过 httpOptions,因为这是默认设置)并发送{name: res}
. 请求正文应该就是这样。
对于文件上传,您应该使用像Multer或Multiparty这样的 Express 中间件。在 Angular 方面,例如ng2-file-upload。
Express 方法回调签名(req, res, next)
不是(res, req)
,阅读代码时会令人困惑:(
如果你只是return
从回调,它会挂起,直到 http 请求超时(我认为)。你应该做res.status(200).end()
或res.json({done: true})
类似的事情。
推荐阅读
- google-maps-api-3 - 如何自定义一种标准的 Google Maps API 地图类型
- jquery - 如何清除以前的 AJAX 响应数据(不是 html/表单数据)?- Django/AJAX
- android - 为什么水平滚动视图中的回收视图不起作用?
- firebase - 如何将 Flutter TimeOfDay 保存到 firebase?
- c++ - 无法使用 std::enable_if 在 g++/clang++ 上编译显式专用模板结构
- apache-nifi - 无法使用 apache Nifi 连接到 Clickhouse 数据库
- python - 请求表单导致错误 405 Method Not Allowed in Flask
- docker - 将人工 blob 转换为 docker 注册表结构
- c++ - 如何使用 ros | cmake 与 gitlab-ci
- reactjs - 从 React 切换到 Next.js 后,由于 Service Worker 的缓存,网站没有刷新。如何强制更新?