Node.js错误:连接ECONNREFUSED

114

我是node的新手,在一个简单的教程中遇到了这个错误。

我正在OS X 10.8.2上尝试使用CodeRunner和终端运行。我还尝试将我的模块放在node_modules文件夹中。

我可以看出这是某种连接问题,但我不知道为什么?

events.js:71
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: connect ECONNREFUSED
    at errnoException (net.js:770:11)
    at Object.afterConnect [as oncomplete] (net.js:761:19)

app.js:

var makeRequest = require('./make_request');

makeRequest("Here's looking at you, kid");
makeRequest("Hello, this is dog");

make_request.js:

var http = require('http');

var makeRequest = function(message) {

    //var message = "Here's looking at you, kid.";
    var options = {
        host: 'localhost', port: 8080, path:'/', method: 'POST'
    }

    var request = http.request(options, function(response) {
        response.on('data', function(data) {
            console.log(data);
        });
    });
    request.write(message);
    request.end();
};

module.exports = makeRequest;

我也将这段代码上传到 https://c9.io/ 上,但是得到了相同的错误。 - ian
开放传入或传出?在使用已定义端口和主机的节点服务器上遇到了同样的问题。如果你真的知道这里发生了什么,请发布一个真正的解决方案,而不是像问题中所述的含糊的评论。我对Node不熟悉。 - ian
2
@ian,你的代码中没有创建服务器。那么,你在8080端口上运行了什么东西,你想要连接它? - Brad
2
对于任何未来的读者,我试图向PHP服务器发出API请求,但我的请求端口未设置为80。一旦更改后,我的HTTP请求就正常工作了。 - Michael J. Calkins
我在 M1 Mac 上运行 Node 17,然后通过 brew uninstall node 卸载了它,接着使用 brew install node@16 安装了 Node 16。一切都很顺利。可能需要使用 brew link --force node@16 命令,但我现在记不清了。 - Joshua Pinter
20个回答

68

你很可能正在面临 node.js 在调用的服务器拒绝连接时崩溃的问题。尝试以下方法:

process.on('uncaughtException', function (err) {
    console.log(err);
}); 

这将使您的服务器保持运行,并为您提供附加调试器并查找更深层次问题的位置。


36
在未捕获异常后让您的服务器继续运行是一件危险的事情。您不知道异常是否使您的服务器处于预期状态。更安全的做法是关闭服务器并由另一个进程重新启动它(当然,要记录异常日志)。 - Martin Epsz
4
总的来说,在不清楚情况的情况下捕获所有异常并不是一个好主意。查看此答案。 - Yan Foto
8
这取决于你想要实现什么目标。我正在编写一个监控应用程序,保持同步和运作至关重要。似乎OP正在努力找出问题所在。所有其他答案都是关于可能导致此错误的特定问题。作为调试步骤,以上几乎总是必要的,才能深入挖掘真正的问题。而且,如果因为一个故障导致服务器崩溃,从而导致所有其他客户端调用开始失败,这对我来说也很奇怪,你对此居然感到满意? - user2957009

11

我在使用 Ghost 和 Heroku 时也遇到了同样的问题。

heroku config:set NODE_ENV=production 

解决了!

请检查您的配置和环境,确保服务器正常运行。


4
你能解释一下为什么这样修复问题吗? - Brad
我使用了 Heroku config:set NPM_CONFIG_PRODUCTION=false。但我想知道它是如何工作的。 - Winnemucca

11

您正在尝试连接到 localhost:8080 ... 是否有任何服务正在您的本地主机上运行并占用了这个端口? 如果没有,则连接将被拒绝,从而导致此错误。我建议先检查 localhost:8080 上是否有任何正在运行的东西。


11

1
我很烦恼,因为这是对我有效的解决方案...而你的回答在这个问题中排名第“unteen”:/ - Ayyash
@Ayyash 很抱歉,但至少你最终找到了它。 :) - Vladimir Lazar

7
当您运行上述代码时,需要在端口8080上运行服务器,并通过响应简单地返回请求。将以下代码复制到单独的文件中(例如“server.js”),并使用node命令启动此服务器(node server.js)。然后,您可以从单独的命令行中分别运行上面的代码(node app.js)。
var http = require('http');

http.createServer(function(request, response){

    //The following code will print out the incoming request text
    request.pipe(response);

}).listen(8080, '127.0.0.1');

console.log('Listening on port 8080...');

7

如果你使用MEAN(Mongo-Express-AngularJS-Node)技术栈,请先运行mongod,这样错误信息就会消失。


1
两天的搜索,然后看到了你的评论,救了我的一天。 - Ahmad Ali

6
有时候,如果代码中有任何数据库连接,但是您尚未启动数据库服务器,则可能会发生连接错误。
在我的情况下,我有一些代码片段用于连接mongodb: mongoose.connect("mongodb://localhost:27017/demoDb"); 当我使用命令mongod启动mongodb服务器后,此错误就消失了。

3

ECONNREFUSED 错误表示无法与目标服务建立连接(在您的情况下为 localhost:8080)。请检查端口8080上运行的服务。

如需了解更多关于Node.js错误的信息,请参考此文档


2

如果你正在使用 NodeJS 版本 > 17,请尝试降级到使用 NodeJS 16。 在 17版本中,默认情况下调试器绑定IP是IPv6,有时你的IDE可能无法连接


谢谢@Steven Shi!这对我来说是个问题。我之前在路由器上禁用了IPv6,重新开启并映射6to4解决了问题。 - undefined

2

当 Node.js 进程仍在运行时,尝试重新启动服务器时,人们会遇到此错误。请尝试以下操作:

ps aux | grep node

这将打印类似于以下内容:

user    7668  4.3  1.0  42060 10708 pts/1    Sl+  20:36   0:00 node server
user    7749  0.0  0.0   4384   832 pts/8    S+   20:37   0:00 grep --color=auto node

在这种情况下,进程的pid为7668。要杀死它并重新启动服务器,请运行 kill -9 7668


6
没错问题不在这里。他在尝试发出请求时遇到了连接被拒绝的问题。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接