【问题标题】:sock.js not allowing POST method for node serversock.js 不允许节点服务器的 POST 方法
【发布时间】:2016-01-15 22:41:22
【问题描述】:

试图启动一个使用 sock.js 进行 websocket 通信的节点服务器。

可以正常启动服务器并建立websocket通信。但是,我们还需要使用 HTTP POST 到这个实例,以便我们可以通过 websocket 发送消息。消息取决于 POST 有效负载...

但是,sock.js 似乎不接受我们正在创建的处理程序,并且只允许 GET 方法。这会导致对服务器执行的任何 POST 都会出现 405 HTTP 代码。

请看下面的代码。如果我删除了 sock.js 实现,我就可以使用服务器处理 GET 和 POST 请求。

var app = require('http');
var sockjs = require('sockjs');
var sk = sockjs.createServer({ sockjs_url: '//cdn.jsdelivr.net/sockjs/1.0.1/sockjs.min.js' });

sk.on('connection', function (conn) {
    console.log('connection' + conn);
    conn.on('close', function () {
        console.log('close ' + conn);
    });
    conn.on('data', function (message) {
        console.log('message ' + conn,
                message);

        conn.write(message);
    });

});

var server = app.createServer( function(req, res) {

    if (req.method == 'POST') {
        console.log("POST");
        var body = '';
        req.on('data', function (data) {
            body += data;
            console.log("Partial body: " + body);
        });
        req.on('end', function () {
            console.log("Body: " + body);
        });
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.end('post received');
    }
    else
    {
        console.log("GET");

        res.writeHead(200, {'Content-Type': 'text/html'});
        res.end('get received');
    }

});

sk.installHandlers(server);

我尝试了不同的方法来设置处理程序,包括遵循示例here;但无论如何,我似乎并没有陷入我的处理程序,而是 sock.js 不允许 POST。

如果这是 sock.js 的预期行为并且正在按照预期的方式工作,那么我们将不胜感激有关使用什么的建议。这是一种远离 socket.io 的尝试,因为这对我们来说并非在所有情况下都有效......但是如果无法 POST 到节点服务器,我们可能也无法使用 sock.js。

【问题讨论】:

  • 这并不能完全回答问题,但你不能在不同的端口上运行它们吗?
  • 我建议您为变量使用更具描述性的名称...app 令人困惑,您可能应该改用http。同上server -> httpserver
  • @jcaron,我同意命名。这只是一个原型,让我了解它是如何工作的。生产代码将被更恰当地命名。谢谢!

标签: javascript node.js websocket sockjs


【解决方案1】:

您在致电installHandlers 时缺少prefix。这导致sockjs 处理所有请求,而不仅仅是那些发往它的请求。

只需指定一个前缀:

sk.installHandler(server,{prefix:"/whatever"});

它当然应该匹配你在客户端使用的前缀。

或者,如果您不想使用前缀,请使用不同的端口。

【讨论】:

  • 我之前尝试过使用相同的 405 HTTP 错误代码的前缀。但是,在您的帖子之后,我所做的是在那里重新设置前缀定义,但尝试不同的资源。因此,我会尝试 /whoever,而不是 /whatever。这很有效——这意味着 sock.js 管理来自前缀路径的任何内容(在本例中为 /whatever),但让其他所有内容通过其余的节点服务器处理程序。现在我看到它可以正常工作,这非常容易理解,但需要一段时间才能理解。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2012-06-11
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
相关资源
最近更新 更多