-1

Я решил поизучать работу с базами данных SQL через JavaScript. У меня есть база данныъ TESTDB и таблица в ней profile. Я хотел с помощью select доставать кол-во строк и из этого получать id нового пользователя. Сначала подключил базу данных:

const mysql=require('mysql');
//config
const connection=mysql.createConnection({
    host:"localhost",
    user:"pmauser",
    database:"TESTDB",
    password:"password_here"

});

После чего с помощью SELECT-запроса нашел новый id:

const sql = `SELECT * FROM profile`;
var new_id;
connection.query(sql, function(err, results) {
    if(err) console.log(err);
    const res=results;
    new_id=res.length+1;
});

Тут все работает правильно, и если добавить в функцию console.log(new_id), то все выводит правильно. Но если в главной программе вызвать console.log(new_id), то либо выводит ошибку, что нет такой функции, либо выводит "undefined". Я так понял, что new_id - локальная переменная и ее надо сделать глобальной. Я пробовал global[new_id]=res.length - не помогло. Что делать?

Nezerix
  • 98
  • Может быть стоит объявить new_id ДО запроса?) – radar4ick Jul 17 '20 at 11:53
  • Вам нужно разобраться с асинхронностью в JavaScript. Например, почитайте этот вопрос с ответами, всё равно вас скорее всего адресуют туда: https://ru.stackoverflow.com/questions/554290/ – vsemozhebuty Jul 17 '20 at 11:53
  • @radar4ick Я объвил и так - просто не выложил. Кстати вопрос: почему если сделать два вывода new_id - в запросе и после - выводит сначала undefined, а потом значение? Должно же быть в обратном порядке. – Nezerix Jul 17 '20 at 12:33
  • сначала выполнился синхронный код, где ваша переменная undefined, потом пришел ответ от запроса и выполнилось присвоение в коллбэке функции, и получилось значение – radar4ick Jul 17 '20 at 12:58
  • @radar4ick что сделать, чтобы они выводились в нормальном порядке и что делать с глобализацией? – Nezerix Jul 17 '20 at 13:11
  • Сделать функцию асинхронной и дождаться её выполнения async/await, а потому уже обращаться к этой переменной – radar4ick Jul 17 '20 at 13:56
  • @radar4ick сделал: (async () => { connection.query(sql, await.function(err, results) { if(err) console.log(err); const res=results; new_id=res.length+1; console.log(new_id) }); })(); Но выводит, что . после await - unexpected token. Что я не так сделал? – Nezerix Jul 17 '20 at 14:26
  • Переменная new_id объявлена с помощью var внутри функции. Поэтому она локальная для этой функции. Либо объявите её снаружи, либо уберите var. – Alexander Petrov Jul 17 '20 at 16:42
  • res.length+1 - нельзя так делать. Потому что после удаления части данных из таблицы вы можете получить потом айдишник, совпадающий с уже имеющимся. – Alexander Petrov Jul 17 '20 at 16:43
  • @AlexanderPetrov у меня так и есть - объявлена в главной программе, в функции без var(см. прошлые комментарии). А насчет res.length - как может быть совпадающий id, если грубо говоря res.length - кол-во строк в базе данных, а значит когда мы добовляем новую строку, то она будет c id=номеру строки – Nezerix Jul 17 '20 at 17:28
  • А что произойдёт, когда вы удалите хотя бы одну (или несколько) строк из таблицы? – Alexander Petrov Jul 17 '20 at 17:31
  • @AlexanderPetrov Аааа понял. Спасибо, что объснили. С этим как-нибудь разберусь потом. Можете подсказать, как должна выглядеть эта часть моей программы, чтобы действия выполнялись синхронно (поочереди), а то, как видите в предыдущих комментариях у меня это не получается. Буду очень признателен. – Nezerix Jul 17 '20 at 17:48

1 Answers1

0

Оказалась проблема в асинхронном программировании. Требуется написать так:

const sql = `SELECT * FROM profile`;
var new_id;

connection.query(sql, async function(err, results) { if(err) console.log(await err); const res=results; new_id=res.length+1; });

Nezerix
  • 98