Using multiple queries and render to HTML - html

I'm trying to complete 2 select with 2 different SQL Server queries in the same HTML.
I'm using this code to complete 1
router.js
app.get('/bajatel', function(req, res, next) {
var data = []
request.query('select NLineas from tb_lineas', function(err, fields){
if(err) {
console.log('error en la busqueda');
return;
}
console.log(fields)
// Pass the DB result to the templates
for (var i = 0; i < fields.recordset.length ; i++){
data.push({NLineas: fields.recordset[i]})
}
res.render('bajatel.html', {Valuelist: data});
console.log(data)
});
});
db.js
var sql = require('mssql');
var config = {
user : 'sa',
password : 'xxxxxxxx',
server : 'xxxxxxxx',
database : 'db_test'
};
var connection = sql.connect(config, function(err) {
if (err){
throw err ;
} else{
console.log('connected');
}
});
module.exports.connection = connection;
I want to add a second query in the app.get to have a second array:
var motivo = []
request.query('Select DescMotivo from tb_Motivos', function(err, rows){
if(err){
console.log('error en la busqueda');
return;
}
for (var i = 0; i < rows.recordset.length; i++){
motivo.push({DescMotivo: rows.recordset[i]})
}
The final render should be:
res.render('bajatel.html',{Valuelist: data, Motivolist: motivo})
but I don't know how to export the data to complete the array outside of the query.
the idea is to have 2 boxes with the queries options and they must select the default values
Could somebody help me?

Related

How to insert json into mysql using node js?

var express = require('express');
var app=express();
var length;
var affiliate = require('flipkart-affiliate');
var url = require('url');
var moment=require('moment');
var mysql = require('mysql');
var body;
var getUrl;
var product;
var offer;
var offer1;
var offer2;
var offer3;
var test1;
var test2;
var test3;
var title=[];
var description=[];
var startTime=[];
var endTime=[];
var json={};
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'coupontest'
});
var client = affiliate.createClient({
FkAffId: 'anandhkum',
FkAffToken: 'eb030998c556443087d3b1a27ac569d0',
responseType: 'json'
});
client.getCategoryFeed({
trackingId: 'anandhkum'
}, function(err, result,getUrl){
if(!err){
body=JSON.parse(result);
getUrl=body.apiGroups.affiliate.apiListings.food_nutrition.availableVariants["v1.1.0"].get;
client.getProductsFeed({
url: getUrl
}, function(err, result){
if(!err){
}else {
console.log(err);
}
});
}
});
connection.connect(function(err) {
if (err) {
return console.error('error: ' + err.message);
}
console.log('Connected to the MySQL server.');
});
app.get('/',function (req,res) {
client.getAllOffers(null,function(err, resp) {
if (!err) {
offer = JSON.parse(resp);
test1 = offer.allOffersList.length;
res.send(offer);
for(var i=0;i<test1;i++){
description[i]=offer.allOffersList[i].description;
startTime[i]=offer.allOffersList[i].startTime;
endTime[i]=offer.allOffersList[i].endTime;
}
var stmt = "INSERT INTO offers(description,start_time,end_time) VALUES (?, ?, ?)";
connection.query(stmt, [description,startTime,endTime], function (err, result) {
if (err) throw err.message;
console.log("Number of records inserted: " + result.affectedRows);
});
}
else {
console.log(err);
}
});
});
app.listen(3000);
console.log("Listening to port 3000");
the code is about getting the offer details as json data from flipkart.com and store it into the mysql table.
But I'm getting the error
throw err; // Rethrow non-MySQL errors
ER_WRONG_VALUE_COUNT_ON_ROW: Column count doesn't match value count at row 1
I tried using many sql syntax but it's showing the above error
Can anyone help me on solving the above error?
Try doing it this way, as I can see you want to insert multiple result at once so need to pass an array values which I have made in following query also the error "ER_WRONG_VALUE_COUNT_ON_ROW" is due to incorrect no of ? that you were passing in the query as you need to insert multiple no of rows so you need to make sure you get correct ? count.
var queryString = "";
var insertString = "(?,?,?),";
var values = [];
for(var i=0;i<test1;i++){
description[i]=offer.allOffersList[i].description;
startTime[i]=offer.allOffersList[i].startTime;
endTime[i]=offer.allOffersList[i].endTime;
values.push(description[i],startTime[i],endTime[i]);
queryString = queryString + insertString;
}
queryString = queryString.substring(0, queryString.length - 1); // is used to remove last ',' which will get inserted while we are creating queryString
var stmt = "INSERT INTO offers(description,start_time,end_time) VALUES " + queryString ;
connection.query(stmt,values, function (err, result) {
if (err) throw err.message;
console.log("Number of records inserted: " + result.affectedRows);
});

MySQL table a global variable, ejs and nodejs

I'm trying to figure out how I can make a global variable that can grab from a mysql table.
app.get('*', function(req, res, next){
res.locals.user = req.user || null;
res.locals.mobs = db.query('SELECT * FROM mobs', function(err, rows){
var rowLength = rows.length;
for (var i = 0; i < rowLength; i++) {
var mobs = rows[i];
}
});
The mobs ones is what I am trying to do. using <%= mobs[0].name %> produces a a cant get from undefined.
I think you need this
db.query('SELECT * FROM mobs', function(err, rows){
res.locals.mobs = rows
});
if you want pass the data to template try this
db.query('SELECT * FROM mobs', function(err, rows){
res.render('view.ejs',{mob:rows})
});
I found an answer! I am not sure if it is the most efficient, but here it is:
app.use(function(req, res, next) {
res.locals.errors = null;
// Mob Database
db.query('SELECT * FROM mobs', function(err, rows){
req.mobs = rows;
res.locals.mobs = req.mobs;
});
next();
});

Read line by line and inserting into mysql nodeJS

I made some code to parse things from some file.log it got 2 different lines that one is line of command and finishing line. So there are 1 000 000 lines of log which is 500 000 entries into DB.
Problem inserting and updating database is to slow.
function getDate(){
var date = new Date().getTime() + (2 * 60 * 60 * 1000);
return new Date(date).toISOString().replace(/T/, ' ').replace(/\..+/, ''); // DATETIME in format yyyy-mm-dd hh:mm:ss
}
var detailLog = false;
var express = require("express");
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'logger'
});
var app = express();
connection.connect(function(err) {
if (!err) {
console.log(getDate(), "Database is connected ... \n");
} else {
console.log(getDate(), "Error connecting database ... \n");
}
});
var file = 'file.log';
var fs = require('fs');
var rl = require('readline').createInterface({
input : require('fs').createReadStream(file)
});
rl.on('line', function(line) {
//searching 'command' since it is in every odd line
if (line.search('command') >= 0) {
//parsing every odd line of log
// insert in logs table
var queryINS = "";
if (detailLog)
console.log(getDate(),'shooting INSERT ');
connection.query(queryINS,
function(err, rows, fields) {
if (err) {
console.log(getDate(), 'Error while performing
insert into logs query: ', queryINS,err);
}
});
if (detailLog)
console.log(getDate(),'INSERT done');
//searching 'Request finished' since it is in every even line
} else if (line.search('Request finished') >= 0) {
//parsing every even line of log
// update logs table
var queryUPD = "";
if (detailLog)
console.log(getDate(),'shooting UPDATE ');
connection.query(queryUPD,
function(err, rows, fields) {
if (err) {
console.log(getDate(), 'Error while performing update
logs query: ',queryUPD,err);
}
});
if (detailLog)
console.log(getDate(),'UPDATE done');
}
}).on('close', function() {
console.log(getDate(), 'Inserted logs into table.');
});

How to parse the data from "rows" object in node.js,express.js,mysql2

I m using the node,express,mysql2 packages .When i m using console.log(rows) ,it is giving me following output:
[{"userid": "test","password": "test"}]
And here is my Code :
var application_root = __dirname,
express = require("express"),
mysql = require('mysql2');
path = require("path");
var app = express();
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '123',
database: "bbsbec"
});
app.configure(function () {
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(application_root, "public")));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
connection.query('SELECT * from pass', function(err, rows) {
res.json(rows);
console.log(rows);
});
I just want to know that how can i parse this "rows" object so that i can retrive both userid and password .
[{"userid": "test","password": "test"}]
This is an Array of Objects. So: First loop over the array to get a single object and then extract its properties:
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
console.log(row.userid);
}
Try this (this is really basic):
connection.query('SELECT * from pass', function(err, rows) {
res.json(rows);
var user = rows[0].userid;
var password= rows[0].password;
});
connection.query('SELECT * from pass', function(err, rows) {
data = rows[0];
let user = data.userid;
let password= data.password;
res.json(rows);
});

Access Multiple table concurrently Mysql Nodejs

I am trying to assing a structured array from two tables, First table select query from which the value in result fetch the ID and assing to the next query, Here is my code
var query = db.query('select * from orderdish'),
users = [];
query
.on('error', function(err)
{
console.log(err);
updateSockets(err);
})
.on('result', function(order,callback)
{
order.abc ='11';
order.OrderKOT=[];
var queryOrderKOT = db.query('select * from tblorderkot where order_Id='+ order.order_Id,function()
{
kotOrders = [];
queryOrderKOT
.on('error',function(err)
{
console.log(err);
updateSocket(err);
})
.on('result',function(orderKOT)
{
kotOrders.push(orderKOT);
})
.on('end', function()
{
console.log(kotOrders);
order.OrderKOT.push(kotOrders);
});
});
console.log(order);
users.push(order);
/* aa(function(){
});*/
})
.on('end', function()
{
// loop on itself only if there are sockets still connected
if (connectionsArray.length)
{
pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL);
console.log("This is End Values");
updateSockets({ users: users });
}
});
It's setting order.OrderKOT to empty. I know the it got to be done with call back in query.on(result) but if I set it's not fetching me any result. Second Query queryOrderKOT is working but it's fetching value pretty late and it's not pusing value to order.OrderKOT. Suggesst me for fetching the value concurrently.
It is likely that the "end" event for the first query is occurring before the second queryOrderKot query has had a chance to complete.
You should experience the expected behavior if you move the main response logic from the "end" of query to the "end" or "result" of queryOrderKot.
After so much of head breaking finally found the solution for concurrent mysql nodejs check #kevin Reilly thanks for trying a lot. I found out what ever we tried was streaming query. Which will be do the process async. Now coming back to the callback I wrote following and it's working perfectly
var query = db.query('select * from orderdish', function (err, results, fields, callback) {
if (err) {
console.log("ERROR: " + err.message);
updateSockets(err);
}
else {
// length of results
var count = 0;
// pass the db object also if you wanna use the same instance
q2(count, results, callback);
}
});
function q2(count, results, callbacks) {
var queryOrderKOT = db.query('select * from tblorderkot where order_Id=' + results[count].order_Id, function (err, resultKOT, KOTFields, callback) {
console.log(resultKOT);
results[count].OrderKOT = resultKOT;
count++;
if (count < results.length) {
q2(count, results, callback);
}
else {
// do something that you need to do after this
console.log(results);
//callbacks(results);
}
});
}
Here is my whole Code,
var mysql = require('mysql')
var io = require('socket.io').listen(3000)
var db = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'vsk',
database: 'hahaha'
})
var POLLING_INTERVAL = 3000, connectionsArray = [], pollingTimer;
db.connect(function (err) {
if (err) console.log(err)
})
var socketCount = 0, restID = 0;
var pollingLoop = function () {
var query = db.query('select * from orderdish'), users = [];
.on('error', function (err) {
console.log(err);
updateSockets(err);
}).on('result', function (order) {
console.log("THis is USerID" + order.order_Id);
order.abc = '11';
order.OrderKOT = [];
var queryOrderKOT = db.query('select * from tblorderkot where order_Id=' + order.order_Id);
kotOrders = [];
queryOrderKOT.on('error', function (err) {
console.log(err);
updateSocket(err);
}).on('result', function (orderKOT) {
kotOrders.push(orderKOT);
query.on('end', function () {
console.log("This is at end values");
// loop on itself only if there are sockets still connected
if (connectionsArray.length) {
pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL);
console.log("This is End Values");
updateSockets({
users: users
});
}
});
}).on('end', function () {
console.log(kotOrders);
console.log("This is my KOT End");
order.OrderKOT.push(kotOrders);
users.push(order);
console.log(users);
//callback(kotOrders);
});
console.log(order);
});
};
io.sockets.on('connection', function (socket) {
console.log("New Connection Opened");
socket.on('restID', function (restIDs) {
console.log(restIDs);
restID = restIDs;
console.log('Number of connections:' + connectionsArray.length);
if (connectionsArray.length > 0) {
console.log("Here is the Pooling Loop");
pollingLoop();
}
});
socket.on('disconnect', function () {
var socketIndex = connectionsArray.indexOf(socket);
console.log('socket = ' + socketIndex + ' disconnected');
if (socketIndex >= 0) {
connectionsArray.splice(socketIndex, 1);
}
});
connectionsArray.push(socket);
});
var updateSockets = function (data) { // adding the time of the last update data.time = new Date();
// sending new data to all the sockets connected connectionsArray.forEach(function(tmpSocket) {
// tmpSocket.volatile.emit('notification', data); console.log(data); tmpSocket.volatile.emit('notification', data); }); };