0

Имеются следующие файлы: router.js

router.post('/database/sqlBilder', jsonParser, function (request, response) {
    if (!request.body) return response.sendStatus(400);
    sqlBilder(request.body.code, request.body.table, [request.body.login, request.body.password]);
});

handler.js

let user = JSON.stringify({ 'code': code,
                            'table': table, 
                            'login': args[0].value, 
                            'password': args[1].value });

let response = await fetch('./database/sqlBilder', { method: 'POST', body: user, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } })

if (response.ok) { let text = response.json(); console.log(text); alert("Запрос выполнен: " + response.status); } else { alert("Ошибка HTTP: " + response.status); }

sqlBilder.js

query = `SELECT * FROM ${table} WHERE`;
// ...
query += ` id = '${args[0]}';`;
pool.execute(query, (err, results)=>{
  if (err) { 
      throw err;
  }
  else{
      console.log('Из базы получена запись');
      console.log(results[0].id);
  }

return JSON.stringify({ 'id': results[0].id}); });

Суть в следующем: к на html страние происходит вызов AJAX-запроса, в него передаются данные, запрос поступает на обработчик, где парсится и его данные уходят в импортированную функицю, там выполняется sql-запрос к базе, который успешно сигнализирует мне о том, что получен верный id. До этого момента все работает. На сколько я понимаю, я должен не просто выполнить sql-запрос, но и вернуть его результат и разумеется данные не возвращаются и на html странице или к консоле браузера вижу Ошибка HTTP: 500.

Хотелось бы узнать как нужно возвращать и принимать результат этого запроса?

  • 1
  • твоя правка ухудшила понимание вопроса и тем не менее, причина твоего вопроса - именно незнание того как работать с callback и promise – nörbörnën Jan 21 '21 at 13:14
  • На счёт правки, согласен, пытался убрать лишнее. С незнанием тоже согласен, но я не понимаю, что делаю не правильно, так как из того, что я читал все должно работать – Александр Jan 21 '21 at 13:16
  • не правильно вот что: код, который запустил sqlBilder никак не взаимодействует с результатом выполнения sqlBilder потому что выполнение sqlBilder асинхронно. как исправить: изучить асинхронность https://learn.javascript.ru/async – nörbörnën Jan 21 '21 at 13:23
  • А почему данный код должен взаимодействовать с результатом? – Александр Jan 21 '21 at 13:30
  • ты сам сказал что это нужно: "я должен не просто выполнить sql-запрос, но и вернуть его результат и разумеется данные не возвращаются" – nörbörnën Jan 21 '21 at 13:31
  • Ну так и где тут связь? Дополнил код, но результат тотже – Александр Jan 21 '21 at 13:33
  • нет :) ты дополнил код client-side, а речь совсем не про него. в вопросе ты описываешь проблему лучше чем в комментариях :) "там выполняется sql-запрос к базе, который успешно сигнализирует мне о том, что получен верный id. До этого момента все работает. На сколько я понимаю, я должен не просто выполнить sql-запрос, но и вернуть его результат" <- у тебя запускается sqlBilder, выполняется запрос, но сервер не получает его результат, не ждёт результат запроса – nörbörnën Jan 21 '21 at 13:37
  • Тогда вообще очень странно. Я руководствовался исходя из того, что когда код в sqlBilder выполнится результат вернется router. Однако это не происходит. Тогда соответственно вопрос: как вернуть туда результат, чтобы потом он вернулся на fetch? – Александр Jan 21 '21 at 14:39
  • в первом комментарии написан ответ на этот вопрос – nörbörnën Jan 21 '21 at 14:40
  • Если рассматривать принятый там ответ в спецификации ES2017, то у меня это написано, т.е. функция handler и мне это не помогло. Другие варианты, тоже не предстваляю как использовать – Александр Jan 21 '21 at 14:46

1 Answers1

0

Это не является до конца решением моей проблемы, но все полезнее комментариев, не объясняющих как исправить проблему.

Во первых, код в файле handler требуется изменить следующим образом:

if (response.ok) {
    const text = await response.json();
    console.log('Успех:', JSON.stringify(text));
    alert("Запрос выполнен: " + response.status);
} else {
    alert("Ошибка HTTP: " + response.status);
};

Во вторых, в файле router внутри обработчика post дописал возврат значения в ответе:

if (!request.body) return response.sendStatus(400);
console.log(request.body);
let result = sqlBilder(request.body.code, request.body.table, [request.body.login, request.body.password]);
console.log(result);
response.json(JSON.stringify({ result: result }));

На текущий момент я могу успешно получить результат на ajax запросе, только если сразу пропишу вместо последней строки следующие:

response.json(JSON.stringify({ 'id': 1 }));

К сожалению пока, что не удалось получить аналогичный ответ с sqlBilder, хотя я на router объявлял ассинхронную функцию, экспериментировал с ассинхронной функцией на самом sqlBilder ...