【问题标题】:Cross-domain connections via Socket.io on Nodejitsu通过 Nodejitsu 上的 Socket.io 进行跨域连接
【发布时间】:2015-04-04 01:39:40
【问题描述】:

我在通过 Socket.io 从 localhost 连接到 Nodejitsu 的远程服务器时遇到了跨域问题。我收到一个错误“...标头包含多个值 'http://evil.com/, *',但只允许一个”。更多详情如下:

我有一个在 Nodejistu 上运行的 Express/Mongoose/Socket.io 应用程序,用作 REST API,它不提供 HTML 文件。

在本地,我有一个 Angularjs+Requirejs 应用程序(在 http://localhost:8000 运行)尝试连接到远程 API,但我无法访问。虽然我可以使用 POSTMAN 测试 API 方法并且能够从 Angular RequireJS 应用程序读取 socket.io 脚本前端,但连接未被授予访问权限并导致服务器崩溃循环。

在 Nodejitsu 上的 NodeJS/Express 应用程序中,我设置了以下内容:

var express    = require('express');
var app        = express();
var bodyParser = require('body-parser');
var morgan     = require('morgan');
var port       = process.env.PORT || 80; // set our port the same as Nodejitsu

// ATTACHING SOCKET.IO
var server = require('http').createServer(app);
var io = require('socket.io')(server);
app.set('socketio', io); // socket instance of the app
app.set('server', server);

// CONFIGURE BODY PARSER
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

//CORS SETTING
app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "http://localhost:8000");
    res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header("Access-Control-Allow-Credentials", "false");
    next();
});

// START SERVER
app.get('server').listen(port);

---------
// package.json

"dependencies": {
    "express": "4.11.1",
    "morgan": "1.5.1",
    "mongoose": "3.8.21",
    "body-parser": "1.10.2",
    "grunt-release": "0.10.0",
    "socket.io": "1.3.2"
},

在 localhost:8000 上的 Angular 应用程序中,我检查了 Header 是否重复,如附件 png 所示。

// main.js

"use strict";

require.config({

    paths: {

        ...

        'socketio': 'http://<MYAPP>.jit.su/socket.io/socket.io';,

        ...

// SocketFactory.js

var socket = io.connect('http://<MYAPP>.jit.su:80/api/boards');

但是,即使我将 Origin 设置为 localhost://8000,我也会收到此错误消息:

XMLHttpRequest cannot load http://<MYAPP>.jit.su/socket.io/?EIO=3&transport=polling&t=1423052553506-7. 
The 'Access-Control-Allow-Origin' header contains multiple values
'http://evil.com/, *', but only one is allowed. 
Origin 'http://localhost:8000'; is therefore not allowed access.

【问题讨论】:

  • 听起来像一个类似的问题/答案:stackoverflow.com/questions/22343384/…stackoverflow.com/questions/27351688/…。听起来当某些与 CORS 相关的标头重复时会发生此错误。您应该仔细检查请求和响应的标头,看看是否有重复。
  • 您可以阅读许多类似的问题/答案here
  • 您好,感谢您的回复@jfriend00!我用关于我的问题的更多细节更新了我的问题。我看不到 Access-Control-Allow-Origin 被复制,但我在 Express 中将其设置为特定于 Localhost:8000。但是,在 Chrome 中,它显示为 evil.com。

标签: websocket socket.io cross-domain nodejitsu


【解决方案1】:

我遇到了同样的错误,但最终它甚至不是 CORS 问题。当using socket.io with express 时,监听服务器,而不是应用程序,如 socket.io 的文档中所述。

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);

(...)

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 2012-02-16
    • 1970-01-01
    • 2011-11-15
    • 2013-10-03
    • 1970-01-01
    • 2014-10-03
    • 2013-01-06
    • 2022-06-30
    相关资源
    最近更新 更多