#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() решается после того, как ответ возвращается в браузер.