簡體   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