Node.js, Express and Mysql. How is correct way -
what i'am trying achieve make db query inside closure. return data , send stuff user. understand best practice use database pooling. problem query not sync.
simplified code:
server.js
var express = require('express'), app = express(), server = require('http').createserver(app), mysql = require('mysql'); app.set('db:pool', mysql.createpool(process.env.database_url)); var myclosure = require('./closure.js')(app)); app.get('/somepage', function(req, res) { var data = myclosure.myquery(); res.send(data); }); app.get('/anotherpage', function(req, res) { var data = myclosure.myquery(); res.send(data); }); app.listen(3000); closure.js
function myclosure(app) { var pool = app.get('db:pool'); return { myquery: function(inp) { pool.getconnection(function(err, db) { if (err) throw err; db.query('select * table', function(err, rows, fields) { if (err) throw err; data = rows[0] db.release(); }); }); return data; } }; } module.exports = myclosure; in examples found db related stuff made in route callback , response sent in query callback. way i'm trying not working myquery returns undefined because sql query not done there.
so correct way handle querys ?
make query-function handle callback too:
// server.js app.get('/somepage', function(req, res) { myclosure.myquery(function(err, data) { // todo: handle error... res.send(data); }); }); // closure.js ... myquery: function(callback) { pool.getconnection(function(err, db) { if (err) return callback(err); db.query('select * table', function(err, rows, fields) { // release connection before return anything, otherwise // won't put pool... db.release(); if (err) return callback(err); callback(null, rows[0]); }); }); } (i left out inp argument because didn't seem used)
Comments
Post a Comment