Quiero que mi script de respuesta http responda con datos de mi servidor SQL. Entonces puedo usar AJAX para actualizar HTML con datos de mi servidor SQL. Y no puedo encontrar una manera de hacer esto. Estoy aprendiendo sobre async y tengo la sensación de que si puedo guardar el resultado de mi función async en una var global, entonces funcionará. Cualquier ayuda me ahorraría el dolor de cabeza.
Mi script de escucha simple es:
var test = "hello!" var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write(test); res.end(); }).listen(8080);y mi codigo sql es:
const util = require('util'); var mysql = require('mysql'); var con = mysql.createConnection({ host: "XXXXX", user: "XXXXX", password: "XXXXX", database: "XXX" }); var DBresult=null; function getdb(){ const query = util.promisify(con.query).bind(con); (async () => { try { const rows = await query('SELECT * FROM mylist'); DBresult=rows; } finally { con.end(); } })() }NO use variables globales o compartidas de mayor alcance para su resultado asíncrono en un servidor. Nunca hagas eso. Ese es un antipatrón por una buena razón porque puede crear problemas de concurrencia intermitente porque más de una solicitud puede estar en proceso al mismo tiempo en su servidor, por lo que esto causaría un acceso conflictivo a esas variables, creando problemas intermitentes, muy difíciles de -Problemas de depuración. Vuelvo a repetir, NUNCA.
No describió una situación exacta para la que está tratando de escribir código, pero aquí hay un ejemplo.
En su lugar, utiliza el resultado dentro del contexto en el que llega de su llamada asincrónica. Si puede usar await , eso generalmente hace que la codificación sea más limpia.
Aquí hay un ejemplo simple:
const con = mysql.createConnection({ host: "XXXXX", user: "XXXXX", password: "XXXXX", database: "XXX" }); const query = util.promisify(con.query).bind(con); http.createServer(async function(req, res) { if (req.path === "/query" && req.method === "GET") { try { const rows = await query('SELECT * FROM mylist'); res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify(rows)); } catch(e) { console.log(e); res.statusCode = 500; res.end(); } } else { // some other respone res.writeHead(200, { 'Content-Type': 'text/plain' }); res.write("hello"); res.end(); } }).listen(8080);Cosas a tener en cuenta aquí:
async para que pueda usar await .await sea detectado por try/catch y se envíe una respuesta de error si hay un error.http simple como una experiencia de aprendizaje, pero pronto descubrirá que usar el marco Express simple le ahorrará mucho tiempo de programación y facilitará mucho las cosas.