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

时间:2016-01-15 22:41:22

标签: javascript node.js websocket sockjs

尝试启动使用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要么。

1 个答案:

答案 0 :(得分:0)

您在prefix的来电中错过了installHandlers。这导致sockjs处理所有请求,而不仅仅是那些发往它的请求。

只需指定一个前缀:

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

它当然应该与您使用客户端的前缀相匹配。

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