sock.js 节点服务器不允许 POST 方法

sock.js not allowing POST method for node server

正在尝试启动使用 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 不允许 POSTs.

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

您在拨打 installHandlers 时漏接了 prefix。这导致 sockjs 处理所有请求,而不仅仅是那些发往它的请求。

只需指定一个前缀:

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

它当然应该匹配您使用的前缀 client-side。

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