Вопрос об исправлении ошибки ENOENT на локальном соединении c MySQL (с node-mysql)
Вложений: 2
Здравствуйте! - Проблема
- Ожидаемый правильный результат
- Код js для соединения
- Успешное выполнение js
- Неуспешное выполнение js
- Сведения об ошибке ENOENT
- Сведения об ошибке в console.log
- Описание ошибки из модуля
- Описание ошибки с сайта
- Результат по указанному адресу и порту
- Исследование различий в соединении
- Вопрос
Проблема
Проявляется при локальном подключении от веб-сервера node к базе данных MySQL с отключенным Интернет соединением. Веб сервер node и база данных MySQL расположены и функционируют на одном и том же компьютере.
При включенном Интернет соединении всё работает в полном объеме.
При выключенном - node и MySQL, система администрирования базы на локальном сервере тоже работает, но запрос из node к базе данных не выполняется.
Ожидаемый правильный результат
Параллельная Интернет соединениям (не зависящая от них) связь сервера node с базой данных.
Исследование проблемы
Привели к обнаружению различия в параметрах подключения при включенном и выключенном Интернет соединении.
Код js для соединения
/*Подключение модуля связи с mysql*/
var mysql = require('../node_modules/npm/node_modules/mysql');
/*Параметры подключения к серверу бд*/
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'root',
database : 'db'
});
/*Вызов подключения*/
connection.connect();
/*Вывод в консоль параметров соединения*/
console.log(connection.database);
/*Строка c SQL запросом*/
var strQuery = "SELECT * FROM t_structtype";
/*Выполнение строки запроса с возвращаемая функция*/
connection.query( strQuery, function(err, rows){
console.log(connection);
if(err) {
console.log( err );//или throw err для более подробного лога;
}else{
console.log( rows );
}
});
/*Завершение соединения*/
connection.end();
Успешное выполнение js
Возвращает в консоль результат запроса, например:
Код:
C:\PROGRA~1\nodejs>node test.js
[ RowDataPacket { id: 1, name: 'процесс' },{...},...] - всё хорошо.
Неуспешное выполнение js
Возвращает сведения об ошибке:
Код:
C:\PROGRA~1\nodejs\smpl\test.js:20
throw err;
^
Сведения об ошибке
Код:
Error: getaddrinfo ENOENT localhost:3306
at Object.exports._errnoException (util.js:890:11)
at errnoException (dns.js:31:15)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:77:26)
--------------------
at Protocol._enqueue (C:\PROGRA~1\nodejs\node_modules\npm\node_modules\mysql\lib\protocol\Protocol.js:141:48)
at Protocol.handshake (<...>\Protocol.js:52:41)
at Connection.connect (<...>\lib\Connection.js:125:18)
at Object.<anonymous> (C:\PROGRA~1\nodejs\smpl\test.js:23:12)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:142:18)
Сведения об ошибке в console.log
Код:
C:\PROGRA~1\nodejs>node test.js
{ [Error: getaddrinfo ENOENT localhost:3306]
code: 'ENOENT',
errno: 'ENOENT',
syscall: 'getaddrinfo',
hostname: 'localhost',
host: 'localhost',
port: 3306,
fatal: true }
Описание ошибки из модуля
Код:
case 'ENOENT':
short.push(['enoent', er.message])
detail.push([
'enoent',
[
er.message,
'This is most likely not a problem with npm itself',
'and is related to npm not being able to find a file.',
er.file ? "\nCheck if the file '" + er.file + "' is present." : ''
].join('\n')
])
break
Описание ошибки с сайта
Код:
ENOENT (No such file or directory): Commonly raised by fs
operations to indicate that a component of the specified pathname
does not exist -- no entity (file or directory) could be found by the given path.
Результат по указанному адресу и порту
Веб страница с адресом и портом для соединения работает и отзывается:
N 5.7.11-log%^p=- X яч!яЃKKxF9 [bKmysql_native_password!я„#08S01Got packets out of order
Всё в порядке, админка бд работает с этим хостом и портом успешно.
Исследование различий в соединении
С отключенным Интернет соединением локалхост работает на нужных портах. Бд работает. Код подключения к бд с node выдает ошибку ENOENT при выполнении запроса.
Исследование соединения с локальным сервером( console.log(connection) ) возвращает описание результатов соединения с разницей в наличии протокола при соединении с Интернетом и без.
Код:
Connection {
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
config:
ConnectionConfig {
host:<...тут всё в порядке...>
clientFlags: 455631,
(!?) protocol41: true },
_socket:
Socket {
_connecting: false,
_hadError: false,
_handle:
(!?) TCP {
_externalStream: {},
fd: -1,
reading: true,
owner: [Circular],
onread: [Function: onread],
onconnection: null,
writeQueueSize: 0 },
_parent: null,
_host: 'localhost',
_readableState:
ReadableState {
<порядок>
(!?) reading: false,
sync: false,
needReadable: true,
emittedReadable: false,
readableListening: false,
resumeScheduled: false,
defaultEncoding: 'utf8',
ranOut: false,
awaitDrain: 0,
readingMore: false,
decoder: null,
encoding: null },
(!?) readable: true,
domain: null,
_events:
{ end: [Object],
finish: [Function: onSocketFinish],
_socketEnd: [Function: onSocketEnd],
data: [Function],
error: [Function: bound ],
connect: [Object] },
(~7) _eventsCount: 6,
_maxListeners: undefined,
_writableState:
WritableState {
objectMode: false,
highWaterMark: 16384,
needDrain: false,
(~) ending: false,
(~) ended: false,
(~) finished: false,
decodeStrings: false,
defaultEncoding: 'utf8',
length: 0,
writing: false,
corked: 0,
(~) sync: false,
bufferProcessing: false,
onwrite: [Function],
writecb: null,
writelen: 0,
bufferedRequest: null,
lastBufferedRequest: null,
pendingcb: 0,
(~) prefinished: false,
errorEmitted: false,
bufferedRequestCount: 0,
corkedRequestsFree: [Object] },
(~) writable: true,
allowHalfOpen: false,
(~) destroyed: false,
(~) bytesRead: 501,
(~) _bytesDispatched: 102,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: null,
_server: null,
_idleTimeout: -1,
_idleNext: null,
_idlePrev: null,
(~) _idleStart: 605,
read: [Function],
_consuming: true },
_protocol:
Protocol {
domain: null,
_events:
{ data: [Function],
end: [Object],
handshake: [Function: bound _handleProtocolHandshake],
unhandledError: [Function: bound ],
drain: [Function: bound ],
enqueue: [Function: bound _handleProtocolEnqueue] },
_eventsCount: 6,
_maxListeners: undefined,
readable: true,
writable: true,
_config:
ConnectionConfig {
host: 'localhost',
port: 3306,
localAddress: undefined,
socketPath: undefined,
user: 'root',
password: 'root',<...тут всё в порядке...>
clientFlags: 455631,
(!?) protocol41: true },
_connection: [Circular],
_callback: null,
(~) _fatalError: null,
_quitSequence:
Quit {
<...> _repeat: null },
_handshakeSequence:
Handshake {
<...>
(?) _handshakeInitializationPacket: [Object] },
(~) _handshaked: true,
_ended: false,
_destroyed: false,
(~) _queue: [ [Object], [Object] ],
(~) _handshakeInitializationPacket:
HandshakeInitializationPacket {
protocolVersion: 10,
serverVersion: '5.7.11-log',
threadId: 77,
scrambleBuff1: <Buffer 3a 35 15 47 06 63 59 67>,
filler1: <Buffer 00>,
serverCapabilities1: 63487,
serverLanguage: 33,
serverStatus: 2,
serverCapabilities2: 33279,
scrambleLength: 21,
filler2: <Buffer 00 00 00 00 00 00 00 00 00 00>,
scrambleBuff2: <Buffer 15 50 22 28 65 4d 64 7c 64 5b 1a 2d>,
filler3: <Buffer 00>,
pluginData: 'mysql_native_password',
protocol41: true },
_parser:
Parser {
_supportBigNumbers: false,
(+) _buffer: <Buffer 01 00 ... >,
_longPacketBuffers: [],
(+) _offset: 408,
(+) _packetEnd: 408,
(+) _packetHeader: [Object],
(+) _packetOffset: 403,
_onError: [Function: bound handleParserError],
_onPacket: [Function: bound ],
(+) _nextPacketNumber: 16,
_encoding: 'utf-8',
_paused: false } },
_connectCalled: true,
(!?)state: 'authenticated',
(!?)threadId: 77 }
Для сравнения - при отключенном интернет соединении лог подключения к локальной бд отличается значениями или отсутствием выделенных знаками (+),(~) или (!?) строк. Отсутствует запись о TCP и protocol41: true и так далее (во вложении подробно).
Вопрос
Подскажите, пожалуйста, способ подключения от локального сервера node к локальной базе данных без соединения с Интернетом.
|