AngularJS将带有JSON数组数据的POST请求发送到Express server

AngularJS将带有JSON数组数据的POST请求发送到Express server,angularjs,node.js,express,amazon-s3,Angularjs,Node.js,Express,Amazon S3,我有一个静态AngularJS网站和一个运行在不同域上的Express服务器。站点使用文件名作为参数向服务器发送GET请求。然后,服务器从S3存储桶请求文件,该存储桶以“二进制/八位字节流”作为“内容类型”发送该文件。它解密数据并将其发送回具有相同“内容类型”的站点,然后该站点下载该文件。这一切都适用于单个文件请求,但是我希望能够同时向服务器发送一组文件名,然后能够下载多个文件。我尝试将文件名作为JSON数组发送,但出现错误: 无法加载XMLHttpRequest。对飞行前请求的响应未通过访问控

我有一个静态AngularJS网站和一个运行在不同域上的Express服务器。站点使用文件名作为参数向服务器发送GET请求。然后,服务器从S3存储桶请求文件,该存储桶以“二进制/八位字节流”作为“内容类型”发送该文件。它解密数据并将其发送回具有相同“内容类型”的站点,然后该站点下载该文件。这一切都适用于单个文件请求,但是我希望能够同时向服务器发送一组文件名,然后能够下载多个文件。我尝试将文件名作为JSON数组发送,但出现错误:

无法加载XMLHttpRequest。对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。因此,不允许访问源“file://”

在我的服务器控制台中,请求显示为选项,而不是POST。我还确保在我的响应标题中包含
访问控制允许来源:
。我应该如何着手解决这个问题

更新:
我可以通过在路由器上添加以下中间件来解决CORS错误:


但是,我仍然不确定如何在响应中发送多个(针对每个文件)“二进制/八位字节流”,并将它们作为静态站点上的文件下载。目前,我正在使用来保存单个请求中的文件。

您需要在服务器中执行一些操作。首先,您是否将
multer
bodyParser
一起使用
Multer
将允许您添加post调用,并为您处理数据传递

第一个AngularJS职位:

$http.post(baseUrl + "mypostmethod", o) //o is your object
       .then(function successCallback(resp) {
           console.log(resp)
       }, function errorCallback(resp) {
           console.log(resp)
       });
现在,对于您的
nodejs-express
设置,您需要确保使用了所有正确的模块。我将提供我在大多数项目中使用的基本列表。另外,如果您使用
req.headers.origin
而不是*您将不再获得
访问控制允许origin
错误

NodeJS:

var express = require('express'),
fs = require('fs'),
spdy = require('spdy'),
bodyParser = require('body-parser'),
multer = require('multer'),
helmet = require('helmet'),
upload = multer(), // this will allow you to pass your object into your post call with express
path = require('path'),
cookieParser = require('cookie-parser'),
request = require('request'),
app = express(),
http = require('http'),
formidable = require('formidable'); //Good for handling file uploads

app.use(helmet());
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH');
    res.header('Access-Control-Allow-Headers', 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version');
    next();
});
这些是我在几乎所有程序中使用的基本工具。使用
express
最重要的是
bodyParser
multer
,因为这将允许您正确使用GET和post

以下是post NodeJS的一个示例:

app.post('/mypostmethod', upload.array(), function(req, res) {
    var body = req.body,
        sess = req.session;
    res.send({
        Status: "Success"
    });
});
在这篇文章中,当您使用使用
upload.array()
时,它正在利用
multer
,现在
req.body
就是您在角度post调用中传递的对象


如果您有任何问题,请告诉我,我希望这会有所帮助。

您是否将其用作Express服务器上的中间件?这不会影响您遇到的CORS问题,但随后您将遇到
req.body
为空,因为您的请求不知道如何解析
Content Type=application/json
Yes。下面是我的服务器javascript文件的一个片段:
app.use(logger('dev');use(bodyParser.json());use(bodyParser.urlencoded({extended:false}));使用(cookieParser());app.use(express.static(path.join(uu dirname,'public'))用于文件上载。但是,当我的服务器调用S3存储桶时,文件将作为“二进制/八位字节流”返回。然后,它处理并解密数据,并使用相同的“内容类型”将其发送到我的静态站点。老实说,我对这一切都不熟悉,不确定我是否做得对,也不确定是否有更好的办法解决这个问题
app.post('/mypostmethod', upload.array(), function(req, res) {
    var body = req.body,
        sess = req.session;
    res.send({
        Status: "Success"
    });
});