I am trying to view the first row of a table but I get the error
TypeError: pendingItem.callback is not a function
at client.connect
var express = require("express");
const {Pool} = require("pg");
var app = express();
var conStr = "postgres://postgres:password#localhost:5432/postgres";
const pool = new Pool();
app.get("/", function(req, res, next) {
pool.connect(conStr, function(err, client, done) {
if (err) {
console.log("not able to get connection " + err);
res.status(400).send(err);
}
client.query("SELECT * FROM Users where id= $1", [1], function(err, result) {
done();
if (err) {
console.log(err);
res.status(400).send(err);
}
res.status(200).send(result.rows);
});
});
});
On Postgres connection Pool using connectionString
First if you are choosing to connect to Postgres using connectionURI, you need to initialize Pool with connectionString param:
const pool = new Pool({
connectionString: connectionString,
})
Then when calling pool.connect you only need to pass callback function:
pool.connect((err, client, release) => {...});
Check documentation on Pooling and different ways of making a connection to Postgres using node-postgres package: here and here
In your case this, it should look like this:
var express = require("express");
const pg = require("pg");
const {Pool} = require("pg");
var app = express();
var conStr = "postgres://postgres:password#localhost:5432/postgres";
const pool = new Pool({
connectionString: conStr
});
app.get("/", function(req, res, next) {
pool.connect(function(err, client, done) {
if (err) {
console.log("not able to get connection " + err);
res.status(400).send(err);
}
client.query("SELECT * FROM Users where id= $1", [1], function(err, result) {
done();
if (err) {
console.log(err);
res.status(400).send(err);
}
res.status(200).send(result.rows);
});
});
});
Related
I'm new in Reactjs. Its been 2 months since I learned Reactjs. I have a question. How to split the mysql code that i created into 2 file and can be call it anywhere. Here i attached the mysql code.
const express = require('express');
const app = express();
const mysql = require('mysql');
const cors = require('cors');
const { response } = require('express');
app.use(cors());
app.use(express.json()); //convert from json
// configure database
const db = mysql.createConnection({
user: 'root',
host: 'localhost',
password: '',
database: 'testdb',
});
// declare function
function getQuery(db, sqlQuery, res) {
db.query(sqlQuery, (err, result) => {
if (err) {
res.send(err.sqlMessage);
} else {
res.send(result);
}
});
}
function setQuery(db, sqlQuery, par, res) {
db.query(sqlQuery, par, (err, result) => {
if (err) {
res.send(err);
} else {
res.send(result);
}
});
}
// configure server port number
const listener = app.listen(process.env.PORT || 3333, () => {
console.log('App is listening on port ' + listener.address().port)
})
// call function
app.get("/users", (req, res) => {
getQuery(db, displayTableQuery, res)
});
app.post("/", (req, res) => {
const RegisterUserQuery = "INSERT INTO users set ?";
const par = req.body;
setQuery(db, RegisterUserQuery, par, res)
});
The code i want to be in other file:
// call function
app.get("/users", (req, res) => {
getQuery(db, displayTableQuery, res)
});
app.post("/", (req, res) => {
const RegisterUserQuery = "INSERT INTO users set ?";
const par = req.body;
setQuery(db, RegisterUserQuery, par, res)
});
How to make the code above in other file so that i can make it globally use for other person in the project. Thank you so much for your time. Hope you guys can help me :(
Create other file, example mysqlDatabase.js. And write in that file :
// configure database
const db = mysql.createConnection({
user: 'root',
host: 'localhost',
password: '',
database: 'testdb',
});
module.exports = db
Then to access in other file, use require and write function without db as argument :
const db = require('./mysqlDatabase.js')
// declare function
function getQuery(sqlQuery, res) {
db.query(sqlQuery, (err, result) => {
if (err) {
res.send(err.sqlMessage);
} else {
res.send(result);
}
});
}
function setQuery(sqlQuery, par, res) {
db.query(sqlQuery, par, (err, result) => {
if (err) {
res.send(err);
} else {
res.send(result);
}
});
}
I am trying to set an API. when the default route is called, with '/', the route can be called several times but the route '/count' can only be called once before crashing with this error:
/Users/node_modules/mysql/lib/protocol/Parser.js:437
throw err; // Rethrow non-MySQL errors
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:467:11)
at ServerResponse.header (/Users/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/Users/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Users/node_modules/express/lib/response.js:267:15)
at ServerResponse.send (/Users/node_modules/express/lib/response.js:158:21)
at Query.<anonymous> (/Users/server_sql/testingAPI/routes/index.js:25:36)
at Query.<anonymous> (/Users/node_modules/mysql/lib/Connection.js:525:10)
at Query._callback (/Users/node_modules/mysql/lib/Connection.js:491:16)
at Query.Sequence.end (/Users/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
at Query._handleFinalResultPacket (/Users/node_modules/mysql/lib/protocol/sequences/Query.js:139:8)
app.js
const http = require('http');
const cors = require('cors');
const body_parser = require('body-parser');
const databases = require('./connection_management');
const route = require('./routes/index');
const app = express();
app.use(cors());
app.use(body_parser.urlencoded({
extended: true
}));
app.use(body_parser.json());
app.use(databases.connectionsSql);
app.use('/', route);
http.createServer(app).listen(8080, (err) => {
if (!err)
console.log("API ready and HTTP listen on port 8080.");
else
console.log(err)
});
module.exports = app;
route/index.js
var router = require('express').Router();
var connection = require('../connection_management');
router.get('/', function(req, res){
res.send('Default route');
});
function getCo(){
return connection.coSql['test'].pool;
}
router.get('/count', function(req, res){
var pool = getCo();
var countQuery = "SELECT COUNT(data) FROM table WHERE data IS NOT NULL";
try {
pool.getConnection(function(errco, connection){
if(errco) return res.send(errco);
connection.query(countQuery, function(error, result){
if (error) throw error;
else {
try{
connection.release();
return res.send(result);
} catch (err) {
return res.send(err);
}
}
});
})
}catch (err){
return res.send(err);
}
})
module.exports = router;
connection_management.js
const fs = require('fs');
var mysql = require('mysql');
var config = fs.readFileSync('config.json');
config = JSON.parse(config);
const coSql = [];
exports.connectionsSql = (req, res, next) => {
for (let i = 0; i < config.sql.databases.length; i++) {
if (coSql[config.sql.databases[i].name]) {
next();
} else {
coSql[config.sql.databases[i].name] = {};
coSql[config.sql.databases[i].name].pool = mysql.createPool({
host: config.sql.databases[i].host,
user: config.sql.user,
password: config.sql.password,
database: config.sql.databases[i].name});
}
}
next();
}
module.exports.coSql = coSql;
config.js
{
"sql":{
"user": "foo",
"password": "bar",
"databases":[
{
"name": "test",
"host": "localhost"
}
]
}
}
Thanks for your help, fixing and understanding the problem.
In route/index.js:
router.get('/count', function(req, res){
var pool = getCo();
var countQuery = "SELECT COUNT(data) FROM table WHERE data IS NOT NULL";
try {
pool.getConnection(function(errco, connection){
if(errco) throw New Error(errco); // <---- CHANGED THIS.
connection.query(countQuery, function(error, result){
if (error) throw error;
else {
try{
connection.release();
return res.send(result);
} catch (err) {
throw New Error(err); // <---- CHANGED THIS.
}
}
});
})
}catch (err){
return res.send(err);
}
})
You might be calling res.send more than once in your code due to the way you've written you error catching.
I have replaced 2 of your res.send() method calls with thrown errors so that they are caught and dealt with in the final catch block at the bottom.
I'm trying to get a result from MongoDB database return as a response for my GET Request when I make the call I'm getting undefined in the response, I'm able to see the result in console log on the database side of the code. I'm feeling like it might have something to do with it being an array
MongoClient = require('mongodb'),
mongodburl = "mongodb://localhost:27017",
mongo = require('mongodb'),
assert = require('assert');
let method={}
method.insertdata=function(data,collectionpara) {
MongoClient.connect(mongodburl, function (err, db) {
assert.equal(null, err);
let dbo = db.db("hor-usData");
let myobj = data;
dbo.collection(collectionpara).insert(myobj, function (err, result) {
assert.equal(null, err);
console.log("insert data");
db.close();
})
})
}
method.deleteRecords=function(collectionpara) {
MongoClient.connect(mongodburl, function (err, db) {
assert.equal(null, err);
let dbo = db.db("hor-usData");
var myquery = {
title: /^B/
};
dbo.collection(collectionpara).deleteMany(myquery, function (err, obj) {
if (err) throw err;
console.log(obj.result.n + " document(s) deleted");
db.close();
})
})
}
method.getdata=function(collectionpara){
MongoClient.connect(mongodburl, function(err, db) {
if (err) throw err;
let dbo = db.db("hor-usData");
dbo.collection(collectionpara).find().toArray(function(err, result) {
if (err){
return reject(err)
}
console.log('result',result);
return resolve(result);
});
});
}
module.exports = method;
and my router code
let assert = require('assert'),
express = require('express'),
router = express(),
swaggerUi = require('swagger-ui-express'),
database=require('../databaseCon'),
// swaggerDocument = require('./swagger.json'),
utils = require('../utils/utils');
var port = process.env.PORT || 3000;
//get donedeal
router.get('/getDonedeal', function (req, res, next) {
let donedealResult = []
donedealResult=database.getdata('donedeal');
res.send(donedealResult);
});
//get carzone
router.get('/getCarzone', function (req, res, next) {
let carzoneResult = [];
carzoneResult=database.getdata('carzone');
res.send(console.log(carzoneResult));
});
router.get('/cars', function (req, res, next) {
res.router('Mainrouter')
});
router.get('/getCarzone', function (req, res, next) {
var resultArray = []
});
router.listen(port);
//app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
//app.use('/api/v1', router);
module.exports = router;
It would be great if anyone can help me out. I am new to node.js, and I am trying to send the data into MSSQL database for my initial project, and as per project requirement I was not able to use any other DB other than MSSQL, and I am getting error value into DB while I execute the insert query. I tried to figure out the error more than a day but end up with nothing. Could anyone help me to fix this error.?
Thanks in advance.
// Server.js
var express = require('express');
var app = express();
var port = process.env.port || 3000;
var bodyParser = require('body-parser');
// create application/x-www-form-urlencoded parser
app.use(bodyParser.urlencoded({ extended: true }));
// create application/json parser
app.use(bodyParser.json());
var ProductController = require('./Controller/ProductController')();
app.use("/app/Data", ProductController)
app.listen(port, function () {
var datetime = new Date();
var message = "Server runnning on Port:- " + port + "Started at :- " + datetime;
console.log(message);
});
// App.js
var express = require('express');
var router = express.Router();
var sql = require("mssql");
var conn = require("../connection/connect")();
var routes = function () {
router.route('/')
.get(function (req, res) {
conn.connect().then(function () {
var sqlQuery = "SELECT * FROM ArduinoSensor";
var req = new sql.Request(conn);
req.query(sqlQuery).then(function (recordset) {
res.json(recordset.recordset);
conn.close();
})
.catch(function (err) {
conn.close();
res.status(400).send("Error while Receive Data");
});
})
.catch(function (err) {
conn.close();
res.status(400).send("Error");
});
});
router.route('/')
.post(function (req, res) {
conn.connect().then(function () {
var transaction = new sql.Transaction(conn);
transaction.begin().then(function () {
var request = new sql.Request(transaction);
request.input("start_time", sql.VarChar(50), req.body.start_time)
request.input("end_time", sql.VarChar(50), req.body.end_time)
request.input("length_time", sql.VarChar(50), req.body.length_time)
request.execute("Usp_InsertSensor").then(function () {
transaction.commit().then(function (recordSet) {
conn.close();
res.status(200).send(req.body);
}).catch(function (err) {
conn.close();
res.status(400).send("Error while inserting data");
});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while inserting data");
});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while inserting data");
});
}).catch(function (err) {
conn.close();
res.status(400).send("Error while inserting data");
});
});
return router;
};
module.exports = routes;
PS:- I have attached the outcome of the coding
Outcome of the image
Below is code of Node.js for getting the data from SQL server but it give an error
"Global connection already exists. Call sql.close() first."
var express = require('express');
var app = express();
app.get('/', function (req, res) {
var sql = require("mssql");
var config = {
user: 'sa',
password: '',
server: '',
database: 'Test'
};
sql.connect(config, function (err) {
if (err) console.log(err);
var request = new sql.Request();
request.query('select * from TestTable', function (err, recordset) {
if (err) console.log(err)
res.send(recordset);
});
});
});
var server = app.listen(5000, function () {
console.log('Server is running..');
});
You should add sql.close() to your code after sql.connect() and it should work.