繁体   English   中英

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

[英]Node.js error: EADDRINUSE, Address already in use

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

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 部分,但没有继续运行)

您真的应该尊重 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();
            }
        });
    }
});

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

就像您不会为要发送给某人的每条消息而在Messenger应用程序中一次又一次地注销并重新登录:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM