无法从NodeJS服务器调用Rails端点(来自Redis pmessage事件)

时间:2015-12-07 23:07:02

标签: node.js http post redis request

节点版本: 0.10.33

我能够成功使用CURL从CLI发出POST请求并获得201响应,并使用Chrome中的Postman获得成功的201响应,但是当我尝试发出POST请求时来自NodeJS,使用http模块或request第三方库,我从Node收到此错误消息:

error:  Error: connect ECONNREFUSED
  at errnoException (net.js:904:11)
  at Object.afterConnect [as oncomplete] (net.js:895:19)

我从Rails得不到任何日志(好像Node因某些原因找不到Rails)。

我尝试过的NodeJS代码:(请注意,createPostData返回一个JSON可序列化对象,该对象成为帖子正文)

在所有示例中,我确保railsHost是'localhost'而railsPort是3000。

第一次尝试:

redisClient.on('pmessage', function(pattern, channel, message) {
    var postData = createPostData(channel),
        options = {
            uri: 'http://' + config.railsHost + ':' + config.railsPort + '/resource',
            method: 'POST',
            json: postData
        };

    if (postData === null) {
        return;
    }

    winston.info('Creating request using options ' + JSON.stringify(options) + '\n and POST data ' + JSON.stringify(postData));

    request(options, function (err, res, body) {
        if (err) {
            winston.error(err);
            return;
        }
        var status = res ? res.statusCode : null;
        if (status === 201) {
            winston.info('Notification processed successfully by Rails');
        } else {
            winston.error('Rails could not create the Notification');
            winston.error('HTTP Status: ' + status + ' -> ' + (res ? res.statusMessage : 'response object was null'));
        }
    });
});

winston.log('subscribing to */*/queue1/pubsub');
redisClient.psubscribe('*/*/queue1/pubsub');

winston.log('log.txt', 'subscribing to */*/queue2/pubsub');
redisClient.psubscribe('*/*/queue2/pubsub');

第二次尝试

redisClient.on('pmessage', function(pattern, channel, message) {
    var postData = createPostData(channel),
        options = {
            uri: 'http://' + config.railsHost + ':' + config.railsPort + '/resource',
            method: 'POST',
            json: true,
            body: postData
        };

// ... the rest is the same as the First Attempt

第三次尝试

redisClient.on('pmessage', function(pattern, channel, message) {
    var postData = createPostData(channel),
        options = {
            uri: 'http://' + config.railsHost + ':' + config.railsPort + '/resource',
            method: 'POST',
            // I also tried replacing 'body' below with 'formData' and 'postData'
            body: JSON.stringify(postData),
            headers: {
                'content-type': 'application/json'
                // I also messed around with upper-casing the 'c' and 't' in 'content-type'
            }
        };

// ... the rest is the same as the First Attempt

第四次尝试 - 现在使用NodeJS本身提供的HTTP模块

redisClient.on('pmessage', function(pattern, channel, message) {
    var postData = JSON.stringify(createPostData(channel)),
        options = {
            host: config.railsHost,
            port: config.railsPort,
            path: '/resource',
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            }
        };

    if (postData === null) {
        return;
    }

    winston.info('Creating request using options ' + JSON.stringify(options) + '\n and POST data ' + postData);

    var req = http.request(options, function (res) {
        var status = res ? res.statusCode : null;
        if (status === 201) {
            winston.info('Notification processed successfully by Rails');
        } else {
            winston.error('Rails could not create the Notification');
            winston.error('HTTP Status: ' + status + ' -> ' + (res ? res.statusMessage : 'response object was null'));
        }
    });

    req.on('error', function (err) {
        winston.error(err);
    }

    req.write(postData)
    req.end();
});

winston.log('subscribing to */*/queue1/pubsub');
redisClient.psubscribe('*/*/queue1/pubsub');

winston.log('log.txt', 'subscribing to */*/queue2/pubsub');
redisClient.psubscribe('*/*/queue2/pubsub');

工作的CURL命令

test.json文件包含与winston日志说的我通过NodeJS请求发送的相同json - 从终端复制粘贴。

curl -d @test.json --header "Content-Type: application/json" http://localhost:3000/resource

得到了201回复。

工作的邮递员请求

与上面的CURL命令中的JSON相同 - 我只是从终端复制粘贴Winston打印输出,我的代码从上面的例子中打印出来。

网址:http://localhost:3000/resource 请求类型:POST 标题:key = Content-Type value = application / json 对于正文,选择'raw'和'JSON',然后粘贴在我从终端日志语句复制的JSON中。

得到了201回复。

1 个答案:

答案 0 :(得分:1)

事实证明我使用的应用程序已将localhost映射到:: 1(IPv6),因此Rails首选在启动时,因此在127.0.0.1上不可用。似乎Node正在将localhost转换为127.0.0.1,因此连接拒绝错误。

使用-b选项在127.0.0.1上运行Rails解决了我的问题。我将依靠谷歌帮我修复我的机器上的localhost k可能会涉及对主机文件的一些微不足道的更改)