Простой запрос HXR возвращает ответ mysql

#javascript #mysql #node.js #asynchronous #xmlhttprequest

#javascript #mysql #node.js #асинхронный #xmlhttprequest

Вопрос:

Я пытаюсь разобраться в асинхронных взаимодействиях между клиентом и сервером раз и навсегда! Я продолжаю спотыкаться об эту проблему, и мне нужно ее понять.

Вот мой камень преткновения:

У меня есть простой файл NodeJS, который должен прослушивать порт 8080 и отвечать результатами запроса mysql. вот оно:

 const mysql = require('mysql');
const http = require('http');
const Promise = require('promise');

const con = mysql.createConnection({
  host: "localhost",
  user: "user",
  password: "password",
  database: "database"
});

const queryDatabase = (query = "SELECT * FROM users") => new Promise( (resolve, reject) => {
  try {
    con.connect( (err) => {
      if (err) throw(err);
      else {
        con.query(query, (err, result, fields) => {
          if (err) throw(err);
          resolve(JSON.stringify(result));
        })
      }
    })
  } catch(err) {
    reject(err);
  }
})

http.createServer( async (req, res) => {
  res.writeHead(200, {'Content-Type': 'text/html'});
  // res.write(req.url);
  res.write('here are your results: ', await queryDatabase());
  res.end();
}).listen(8080);
  

Когда я запускаю этот файл и указываю на него в своем браузере, я получаю сообщение «вот ваши результаты: » но безрезультатно.

Я знаю, что это действительно простая проблема, с которой я буду встречаться снова и снова.

Если бы кто-нибудь мог привести простой пример работы этого кода и, возможно, указать мне на какое-то подходящее чтение, я был бы невероятно благодарен.

Спасибо,

Dan.

Ответ №1:

Смотрите https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback .

Подпись:

 response.write(chunk[, encoding][, callback])
  

Кажется, вы используете результат запроса как encoding вместо chunk . Попробуйте что-то вроде:

 res.write('here are your results: '   await queryDatabase());
  

Комментарии:

1. Привет, спасибо за ваш ответ. Я попробовал ваше предложение, и оно не изменило результат. Я не получаю никаких ошибок ни в консоли (мой терминал bash), ни в браузере. Я думаю, что проблема связана с синхронностью, т.Е. Результат из queryDatabase() решается после того, как ответ возвращается в браузер.