Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Вопрос об исправлении ENOENT на локальном соединении c MySQL (с node-mysql) (https://javascript.ru/forum/node-js-io-js/62541-vopros-ob-ispravlenii-enoent-na-lokalnom-soedinenii-c-mysql-s-node-mysql.html)

noomnau 15.04.2016 15:04

Вопрос об исправлении ошибки ENOENT на локальном соединении c MySQL (с node-mysql)
 
Вложений: 2
Здравствуйте!
  1. Проблема
  2. Ожидаемый правильный результат
  3. Код js для соединения
  4. Успешное выполнение js
  5. Неуспешное выполнение js
  6. Сведения об ошибке ENOENT
  7. Сведения об ошибке в console.log
  8. Описание ошибки из модуля
  9. Описание ошибки с сайта
  10. Результат по указанному адресу и порту
  11. Исследование различий в соединении
  12. Вопрос
Проблема
Проявляется при локальном подключении от веб-сервера 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 к локальной базе данных без соединения с Интернетом.

khusamov 22.08.2016 13:52

Вы решили эту проблему? Если да, то как?

Bond 27.08.2016 00:20

У меня такая же проблема. БД юзаю от Денвера, еще с пыха осталась, пока ничего другого не ставил.
Тоже копал в этом направление но не так глубоко как ТС. Поковыряюсь еще, посмотрю.

astafiev 12.04.2017 09:49

Решение есть!
 
Столкнулся с похожей проблемой. Нашел решение на других форумах. Все дело в некорректной работе службы DNS. Вместо localhost в путях к базам нужно указывать адрес 127.0.0.1. Надеюсь Вам поможет! Удачи!


Часовой пояс GMT +3, время: 14:55.