0

Стандартный код для преобразования данных с MySQL запроса в JSON формат, но он у меня не работает:

http.createServer((request, response) => {
    const result = database.getData("tableNames");
    console.log(result);
 var resultArray = Object.values(JSON.parse(JSON.stringify(result)));

 resultArray.forEach(function(v){ console.log(v) });

response.end('odd'); 

}).listen(3000);

Содержимое метода getData:

     function getTableNames(){
        var returnValue;
    con.query("SELECT table_name FROM information_schema.tables WHERE table_schema = 'storagedb'", function (err, result) {
        if (err) throw err;
        console.log(result);
        returnValue = result;
    });

     return returnValue;

}

function getData(arg){ switch(arg){ case "tableNames" : return getTableNames(); break; default : return 404; } }

Консоль выдаёт вот такую ошибку:

undefined:1
undefined
^

SyntaxError: Unexpected token u in JSON at position 0 at JSON.parse (<anonymous>) at Server.<anonymous> (C:\Users\Lecht\Documents\Warehouse\WareHouse Server\server.js:14:39)

Содержимое result выглядит так:

[
  RowDataPacket { TABLE_NAME: 'движение товара' },
  RowDataPacket { TABLE_NAME: 'получатели' },
  RowDataPacket { TABLE_NAME: 'поставщики' },
  RowDataPacket { TABLE_NAME: 'приход' },
  RowDataPacket { TABLE_NAME: 'расход' },
  RowDataPacket { TABLE_NAME: 'справочник товаров' }
]

Подскажите пожалуйста, как правильно извлечь JSON с этого запроса?

  • result это строка с указанным содержимым? Если так, то не должно быть упомянутой ошибки, но код выглядит лишённым смысла (в resultArray будут просто отдельные символы строки). – vsemozhebuty Jun 01 '21 at 16:36
  • 1
    где-то как-то так получается, что result равен undefined. @Grundy хорошо объяснил https://ru.stackoverflow.com/a/883027/2659 откуда берётся Unexpected token u – nörbörnën Jun 01 '21 at 16:38
  • На счёт undefined мне известно. JSON всё равно не парситься из JSON.Stringify(result). При JSON.parse выдаёт undefined, что странно. И да содержимое Result указано в последнем участке кода. – Alexey Tovshik Jun 01 '21 at 16:42
  • А что выводится, если вставить console.log(result)? – vsemozhebuty Jun 01 '21 at 16:43
  • заверните вызовы в trycatch, поставьте отладочную печать, проследите за правильной обработкой асинхронных вызовов и найдёте причину. с тем, количеством кода, что вы выложили, можно сформулировать только такой ответ – nörbörnën Jun 01 '21 at 16:44
  • Содержимое result при выводе с помощью console.log: [ RowDataPacket { TABLE_NAME: 'движение товара' }, RowDataPacket { TABLE_NAME: 'получатели' }, RowDataPacket { TABLE_NAME: 'поставщики' }, RowDataPacket { TABLE_NAME: 'приход' }, RowDataPacket { TABLE_NAME: 'расход' }, RowDataPacket { TABLE_NAME: 'справочник товаров' } ] – Alexey Tovshik Jun 01 '21 at 16:45
  • у вас как минимум два вызова – nörbörnën Jun 01 '21 at 16:45
  • Кинул оставшееся строки кода, проверьте – Alexey Tovshik Jun 01 '21 at 16:54
  • 1
    getTableNames асинхроннная, при таком использовании она всегда вернёт undefined – nörbörnën Jun 01 '21 at 16:56
  • А можно совет? Как правильно сделать? – Alexey Tovshik Jun 01 '21 at 16:58
  • Прочитайте ответ по ссылке выше и перестройте код. То есть или вставляйте последующую логику внутри колбека, в котором получаете результат асинхронного вызова, или меняйте всё на промисы и async/await, если возможно. Это короткий ответ. Но чтобы понять его смысл, нужно разобраться в асинхронности. Например, тут: https://learn.javascript.ru/async (или в оригинале https://javascript.info/async). Первая глава уже немного поможет. – vsemozhebuty Jun 01 '21 at 17:04
  • присоединяюсь. я бы посоветовал чуть более ссылок: https://learn.javascript.ru/callbacks, https://learn.javascript.ru/promise-basics, https://learn.javascript.ru/async-await – nörbörnën Jun 01 '21 at 17:06
  • Ещё из того раздела может пригодиться https://learn.javascript.ru/promisify, если библиотека для базы данных не имеет API с промисами и захочется сделать вручную. – vsemozhebuty Jun 01 '21 at 17:08
  • "Ещё из того раздела может пригодиться...", для mysql есть https://www.npmjs.com/package/mysql2 – nörbörnën Jun 01 '21 at 17:19
  • Решил проблему, дело было в асинхронности getTableNames() – Alexey Tovshik Jun 01 '21 at 17:21
  • каким способом решил? – nörbörnën Jun 01 '21 at 18:01
  • Через callback. Синхронизировал так. – Alexey Tovshik Jun 02 '21 at 10:22

0 Answers0