节点版本: 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
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');
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回复。
答案 0 :(得分:1)
事实证明我使用的应用程序已将localhost映射到:: 1(IPv6),因此Rails首选在启动时,因此在127.0.0.1上不可用。似乎Node正在将localhost转换为127.0.0.1,因此连接拒绝错误。
使用-b选项在127.0.0.1上运行Rails解决了我的问题。我将依靠谷歌帮我修复我的机器上的localhost k可能会涉及对主机文件的一些微不足道的更改)