2013-07-30 2 views
3

У меня есть простой скрипт Node.JS (просто скрипт, без сервера), который должен делать что-то каждые 24 часа. Но примерно через 8 часов я вижу это в журнале ошибок:Node.js + setInterval = Соединение потеряно: сервер закрыл соединение

Error: Connection lost: The server closed the connection. 
    at Protocol.end (/home/user/dev/app/node_modules/mysql/lib/protocol/Protocol.js:73:13) 
    at Socket.onend (stream.js:79:10) 
    at Socket.EventEmitter.emit (events.js:117:20) 
    at _stream_readable.js:910:16 
    at process._tickCallback (node.js:415:13) 
error: Forever detected script exited with code: 8 
error: Forever restarting script for 1 time 

Я уверен, что это глупо, и это легко исправить, но я просто не могу найти его еще. Есть идеи?

+1

Без просмотра вашего кода было бы трудно сказать, конечно. Однако ошибка говорит о том, что делать с вашим соединением MySQL: возможно, если вы держите его открытым - это выпадение после длительного периода бездействия. – Xophmeister

+1

Похоже, что соединение было закрыто с другой стороны. Было бы полезно увидеть некоторый код. – freakish

+0

Я делаю несколько запросов $ .get и некоторые MySQL-запросы. Код заходит через несколько минут. –

ответ

6

Похоже, что вы поддерживаете открытое соединение с удаленным сервером MySQL. Удаленный сервер закрывает соединение через 8 часов бездействия. Таким образом, у вас есть два варианта. Либо вы отправляете запрос keepalive, либо отключитесь после вашего первоначального запроса, а затем снова откроете соединение, когда таймер инициирует следующее событие.

Keepalive

Если вы хотите отправить запрос, оставайтесь в живых просто настроить select 1 на интервальном таймере.

select 1 - это простой запрос, который заставит MySQL вернуть результат 1 и сбросить время ожидания соединения с сервером MySQL. Это будет выглядеть примерно так.

function keepalive() { 
    connection.query('select 1', [], function(err, result) { 
    if(err) return console.log(err); 
    // Successul keepalive 
    }); 
} 
setInterval(keepalive, 1000*60*5); 

Объединив

Тем не менее, лучше использовать модуль MySQL, pool functionality. Он будет подключаться к серверу MySQL по мере необходимости и автоматически будет обрабатывать разъединения.

+0

Что такое «выбрать 1»? –

+0

Я только что обновил ответ, чтобы дать вам более подробную информацию. – Daniel

+0

Спасибо за ваш ответ. Есть ли способ проверить это, не дожидаясь 8 часов? :) –

Смежные вопросы