我已经在node的express框架上编写了一个REST API.js在Chrome的js控制台和URL栏中处理请求.我现在正试图让它在不同域(CORS)上处理来自另一个应用程序的请求.

javascript前端自动发出的第一个请求是/api/search?uri=,并且似乎在"飞行前"选项请求中失败.

在我的express应用程序中,我使用以下方法添加CORS标题:

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
      res.send(200);
    }
    else {
      next();
    }
};

以及:

app.configure(function () {
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(allowCrossDomain);
  app.use(express.static(path.join(application_root, "public")));
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

从Chrome控制台我可以看到以下标题:

请求URL:http://furious-night-5419.herokuapp.com/api/search?uri=http%3A%2F%2Flocalhost%3A5000%2Fcollections%2F1%2Fdocuments%2F1

请求方法:选项

状态代码:200 OK

请求头

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-annotator-auth-token, accept
Access-Control-Request-Method:GET
Connection:keep-alive
Host:furious-night-5419.herokuapp.com
Origin:http://localhost:5000
Referer:http://localhost:5000/collections/1/documents/1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5

查询字符串参数

uri:http://localhost:5000/collections/1/documents/1

响应头

Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
X-Powered-By:Express

这看起来像是API应用程序没有发送正确的头吗?

谢谢

推荐答案

我在一个干净的ExpressJS应用程序上判断了你的代码,它运行得很好.

try 将app.use(allowCrossDomain)移至"配置"功能的顶部.

Node.js相关问答推荐

如何在Mongoose中调用动态Collection ?

Mongoose抱怨说,整数是数字,而不是整数

如何模拟 mysql2 `getConnection`

TS[2339]:类型 '() => Promise<(Document & Omit) | 上不存在属性空>'

MongoDB:通过匹配输入字符串或输入字符串中的单个单词进行搜索

Typescript 正则表达式:过滤器返回空

NodeJS 中的流 API 数据如何流动?

Node.js |如何在微服务之间转发标头?

Google Calendar API FreeBusy 外部用户

TypeError:changeChecked 不是函数

如何在 cypress 测试中进行计算

等价于 Node.js 的 Rails 控制台

socket.io 发出回调合适吗?

在 Node.js 中的两个不同进程之间进行通信

如何为 node.js 服务器分配域名?

如何在 NodeJs 中下载和解压缩内存中的 zip 文件?

如何在 node 中转义 shell 命令的字符串?

Puppeteer:如何提交表单?

如何创建安全(TLS/SSL)Websocket 服务器

将 expressjs 绑定到特定的 IP 地址