Node.js错误:EADDRINUSE,地址已在使用中

时间:2011-07-20 08:31:13

标签: javascript node.js

出于测试目的,我已经设置了这个小脚本:

Client = require('mysql').Client, client = new Client(); 
client.user = 'root'; client.password = 'root'; client.port = 8889;

counter = 0; data = '';
setInterval(update, 10);

function update(){
    counter++; request();
}
var sys = require('sys'), fs = require('fs'), http = require('http'),
    url = require('url'),port = 8001;

http.createServer(function(request, response) {
    response.writeHead(200, {
        'Content-Type': 'text/html'
    }); response.end('Hello world');
}).listen(port);

function request(){
    client.connect();
    client.query('USE db');
    client.query(
    'SELECT * FROM table', function selectCb(err, results, fields) {
        if (err) { throw err; }
        if(results.length > 0)
        {
            var firstResult = results[0];
            data = firstResult['data'];
        }
        client.end();
    }
    );
}

它工作正常,但是,大约一个小时后,服务器崩溃并输出以下错误:

node.js:180
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: EADDRINUSE, Address already in use

更新

我更新了代码。它现在包含一些mysql。 这肯定会引起问题,虽然我不确切知道原因。让这部分稳定循环。此外,我将时间间隔更新为每10毫秒。 (服务器在几分钟后崩溃,其中包含mysql部分,但在没有运行的情况下继续运行)

2 个答案:

答案 0 :(得分:3)

你真的应该尊重pimvb关于不能每秒连接100次数据库的评论。如果node-mysql没有正确清理连接或立即清理连接,那么很可能会在大约一小时内用完连接的可用端口(实际上更像是10分钟左右),使用netstat | grep WAIT | wc -l查看有多少连接您已暂停的已关闭的连接。)

此外,您应该了解JavaScript / node.js的异步特性。当其他查询仍处于待处理状态时,您可能不希望在如此紧凑的循环中运行新查询。这只会堆积起来,SQL服务器会窒息。

更新

以下内容可能会阻止您阻塞服务器。它将发出尽可能多的请求,但每10毫秒不超过1个。 免责声明:黑客入侵文本框,未经测试!

Client = require('mysql').Client, client = new Client(); 
client.user = 'root'; client.password = 'root'; client.port = 8889;

counter = 0; data = '';

client.connect(function {
    setInterval(update, 10);

    var queryPending = false, queryReIssue = false;

    function update(){
        if (queryPending) {
            queryReIssue = true;
        } else {
            request();
        }
        counter++;
    }
    var sys = require('sys'), fs = require('fs'), http = require('http'),
        url = require('url'),port = 8001;

    http.createServer(function(request, response) {
        response.writeHead(200, {
            'Content-Type': 'text/html'
        }); response.end('Hello world');
    }).listen(port);

    function request(){
        requestPending = true;
        client.query('USE db');
        client.query('SELECT * FROM table', function selectCb(err, results, fields) {
            requestPending = false;
            if (err) { console.log('ERROR: ' + err.message) }
            if(results.length > 0) {
                var firstResult = results[0];
                data = firstResult['data'];
            }
            if (queryReIssue) {
                queryReIssue = false;
                request();
            }
        });
    }
});

答案 1 :(得分:2)

每10毫秒连接一次,这会给MySQL服务器带来沉重负担。我不知道你怎么可能得到'正在使用的地址'错误,但你可能想尝试连接一次并使用连接来执行查询。

就像您没有注销并在信使应用程序中一次又一次地重新登录您要发送给某人的每条消息:)