Unable to connect to MySql server from Node.js - mysql

I am new to MySQL and cannot seem to connect to the server from Node.js. Also, I am on windows, not UNIX.
I am able to connect to the server using sqlcmd logged into the user I created for node. I have also enabled TCP/IP and named pipes.
const express = require("express");
const mysql = require("mysql");
const app = express();
const sqlServer = mysql.createConnection({
server: "127.0.0.1",
port: "1433",
user: "MeetMe",
password: "dOI9Zham1f5xOJAvweUIvuWlc"
});
const SELECT_ALL_QUERY = "SELECT * FROM Accounts";
sqlServer.connect(function(err) {
console.log("Connected to sql server");
if (err) throw err;
});
app.get("/", (req, res) => {
sqlServer.query(SELECT_ALL_QUERY, function(err, results, fields) {
if (err) throw err;
console.log(results);
});
res.send("Hello world");
});
app.listen(4000);
console.log("Server running on port 4000");
The program always throws an error during sqlServer.connect().
C:\dev\Webapps\meet-me\server.js:16
if (err) throw err;
^
Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:111:27)
--------------------
at Protocol._enqueue (C:\dev\Webapps\meet-me\node_modules\mysql\lib\protocol\Protocol.js:144:48)
at Protocol.handshake (C:\dev\Webapps\meet-me\node_modules\mysql\lib\protocol\Protocol.js:51:23)
at Connection.connect (C:\dev\Webapps\meet-me\node_modules\mysql\lib\Connection.js:119:18)
at Object.<anonymous> (C:\dev\Webapps\meet-me\server.js:14:11)
at Module._compile (internal/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)

MySQL's default port number is 3306.
Your createConnection options object mentions port 1433. That's the default port for Microsoft SQL server. Try removing the port element from that object. Or, if that doesn't work, change it to 3306.

I realized there is a difference in MicrosoftSQL and MySQL. Thank you for everyone that tried to help!

Related

'argument hostname required' vhost

Having a weird issue with express vhost inside AWS. Every time I deploy I get an error in my EB log saying:
TypeError: argument hostname is required
at vhost (/var/app/current/node_modules/vhost/index.js:39:11)
at Object.<anonymous> (/var/app/current/app.js:554:9)
at Module._compile (internal/modules/cjs/loader.js:999:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
at Module.load (internal/modules/cjs/loader.js:863:32)
at Function.Module._load (internal/modules/cjs/loader.js:708:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
at internal/main/run_main_module.js:17:47
/var/app/current/node_modules/vhost/index.js:39
throw new TypeError('argument hostname is required')
^
If I have a look at the vhost module, index.js: line 36 we have the following:
function vhost(hostname, handle) {
if (!hostname) {
throw new TypeError('argument hostname is required')
}
if (!handle) {
throw new TypeError('argument handle is required')
}
if (typeof handle !== 'function') {
throw new TypeError('argument handle must be a function')
}
Not even any typechecking or anything on hostname like there is for handle, just checking if the value is passed in. Which it clearly is in the following code:
const app = express();
const register_app = express();
const nonadmin_app = express();
register_app.use(express.static(path.resolve(__dirname, './build/register')));
nonadmin_app.use(express.static(path.resolve(__dirname, './build/nonadmin')));
app.use(vhost('register.<eb-dev-url>.elasticbeanstalk.com/', register_app))
app.use(vhost('nonadmin.<eb-dev-url>.elasticbeanstalk.com/', nonadmin_app))
app.use(vhost('api.<eb-dev-url>.elasticbeanstalk.com/', api))
register_app.get('/register', (req, res) => {
res.sendFile(path.resolve(__dirname, './build/register', 'index.html'));
})
nonadmin_app.get('/nonadmin', (req, res) => {
res.sendFile(path.resolve(__dirname, './build/nonadmin', 'index.html'));
})
I'm not convinced this is a problem with vhost because when using register.localhost, nonadmin.localhost, or api.localhost when running this app locally using nodemon it works just fine. I also tried deploying with a .localhost suffix and still did not work.
Is there something I am missing in terms of AWS hostname config?
The answer was trailing slashes in the hostname argument.
Will raise a bug request.

ETIMEOUT error | Google Cloud SQL database with NodeJS

I have created a mysql database on google cloud that I'd like to access from a separate node web application (also running on google cloud). I am testing the connection locally on my computer first, and when I run the following code locally I can successfully establish a connection to my database and see the data in it.
'use strict';
// [START app]
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const app = express();
const mysql = require('mysql');
var connection = mysql.createConnection({
host : 'Cloud SQL IP',
user : 'username',
password : 'password',
database : 'db_name'
});
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
// Make globals.js accessible
app.use(express.static(__dirname + '/'));
app.get('/', (req, res) => {
connection.connect();
connection.query('SELECT * FROM Users', function (error, results, fields) {
if (error) throw error;
console.log(results);
});
connection.end();
res.status(200).send('Hello World!');
});
app.get('/login', (req, res) => {
res.status(200).send();
});
// [START server]
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
console.log(`App listening on port ${PORT}`);
console.log('Press Ctrl+C to quit.');
});
// [END app]
However when run this same code in my google app engine (for both debugging on port 8080 and fully deployed on https://myapp.appspot.com) I get the following timeout error:
{ Error: connect ETIMEDOUT
at Connection._handleConnectTimeout (/home/megan_cooper2900/project/node_modules/mysql/lib/Connection.js:419:13)
at Socket.g (events.js:292:16)
at emitNone (events.js:86:13)
at Socket.emit (events.js:185:7)
at Socket._onTimeout (net.js:338:8)
at ontimeout (timers.js:386:14)
at tryOnTimeout (timers.js:250:5)
at Timer.listOnTimeout (timers.js:214:5)
--------------------
at Protocol._enqueue (/home/megan_cooper2900/project/node_modules/mysql/lib/protocol/Protocol.js:145:48)
at Protocol.handshake (/home/megan_cooper2900/project/node_modules/mysql/lib/protocol/Protocol.js:52:23)
at Connection.connect (/home/megan_cooper2900/project/node_modules/mysql/lib/Connection.js:130:18)
at app.get (/home/megan_cooper2900/journeyma/app.js:31:13)
at Layer.handle [as handle_request] (/home/megan_cooper2900/project/node_modules/express/lib/router/layer.js:95:5)
at next (/home/megan_cooper2900/project/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/megan_cooper2900/project/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/megan_cooper2900/project/node_modules/express/lib/router/layer.js:95:5)
at /home/megan_cooper2900/project/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/megan_cooper2900/project/node_modules/express/lib/router/index.js:335:12)
errorno: 'ETIMEDOUT',
code: 'ETIMEDOUT',
syscall: 'connect',
fatal: true }
Why is this not working on the Google App Engine application?
In your connection configuration for mysql,host does not work on App Engine. You have to use socketPath . socketPath is the path to a unix domain socket to connect to. When used host and port are ignored. (transferred knowledge from using Loopback on App Engine flex. it had me banging my head for days lol). It's value is your Cloud SQL Instance connection name
so in your case, it should look like this: /cloudsql/my-project-12345:us-central1:mydatabase
var connection = mysql.createConnection({
socketPath : '/cloudsql/my-project-12345:us-central1:mydatabase',
user : 'username',
password : 'password',
database : 'db_name'
});
It's a similar process if you're using Postgres on GCloud which is answered here
I also did faced the same issue and I was using Kubernetes pods to access my CloudSQL instance. I got a fix by increasing the timeout in the configuration.
cloudSqlConfig: {
connectionLimit: 10,
host: 'your-host-ip',
user: process.env.DB_USERNAME,
password: process.env.DB_PASSKEY,
database: 'myDB',
connectTimeout: 20000,
waitForConnections: true,
queueLimit: 0
},

Error when connecting to MYSQL Database (NodeJS, socket.io, express)

me and a friend just started to work on a little App. It uses NodeJS (with Socket.io and Express). We're kind of new into NodeJS and thus can't really comprehend why we get the error we get. Every inch of help is appreciated :)
Here's the code:
var express = require('express');
var app = express();
var serv = require('http').Server(app);
app.get('/', function(req, res) {
res.sendFile(__dirname + '/client/index.html');
});
app.use('/client', express.static(__dirname + '/client'));
serv.listen(2000);
console.log("Server started!");
var io = require('socket.io')(serv,{});
var md5 = require('md5');
var mysql = require('mysql');
var dbconn = mysql.createConnection({
host: "mySERVER",
user: "myUSER",
password: "myPASSWORD",
database: "myDBNAME"
});
dbconn.connect(function(err) {
if (err) throw err; //THE ERROR IS THROWN HERE
});
io.sockets.on("connection", function(socket) {
socket.on("register", function(obj){
var sql = 'INSERT INTO users (name, password) VALUES ("' + obj.name + '", "' + md5(obj.password) + '")';
dbconn.query(sql, function (err, result) {
if (err) throw err;
console.log("Result: " + result);
});
});
});
And here's the Error Message:
Error: connect ECONNREFUSED mySERVER:3306
at Object.exports._errnoException (util.js:1018:11)
at exports._exceptionWithHostPort (util.js:1041:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1086:14)
--------------------
at Protocol._enqueue (PROJECTPATH\node_modules\mysql\lib\protocol\Protocol.js:145:48)
at Protocol.handshake (PROJECTPATH\node_modules\mysql\lib\protocol\Protocol.js:52:23)
at Connection.connect (PROJECTPATH\node_modules\mysql\lib\Connection.js:130:18)
at Object.<anonymous> (PROJECTPATH\app.js:32:8)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
Thank you in advance!
It's a database connection error. You're mysql host and/or port are wrong.
Make sure the information passed to the mysq.createConnection function in the code below are correct:
var dbconn = mysql.createConnection({
host: "mySERVER",
user: "myUSER",
password: "myPASSWORD",
database: "myDBNAME"
});

Node Js : MYSQL is not connecting

I am new to node.js, so i am stuck at this point. I have tried to learn it from these sites Code Mentor and Github
Till now i have done this :
var mysql = require('mysql');
var app = express();
// Database operations
var connection = mysql.createConnection({
host : 'localhost',
port : '8888',
user : 'sharad',
password : 'teks',
dbName : 'FirstDataBase'
});
connection.connect(function (error) {
if (error){
console.error('error connecting :' + error.stack);
return;
}
console.log('Connected as id :'+ connection.threadId);
});
app.get("/",function(request,response){
console.log(' saving');
var post = {from:'me', to:'you', msg:'hi'};
connection.query('INSERT INTO FirstDataBase SET ?', post, function(err, result) {
if (err) throw err;
});
});
app.get("/",function(request,response){
connection.query('SELECT * from FirstDataBase', function(err, rows, fields) {
connection.end();
if (!err)
console.log('The solution is: ', rows);
else
console.log('Error while performing Query.');
});
});
app.listen(8888);
I can not see any log i am printing in my code. Any help would be appreciated. Thanks
Edits :
Error i get if i remove last line app.listen(8888);
error connecting :Error: connect ECONNREFUSED 127.0.0.1:8888
at Object.exports._errnoException (util.js:907:11)
at exports._exceptionWithHostPort (util.js:930:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1077:14)
--------------------
at Protocol._enqueue (/Users/Admin/IdeaProjects/FirstNodeJS/node_modules/mysql/lib/protocol/Protocol.js:141:48)
at Protocol.handshake (/Users/Admin/IdeaProjects/FirstNodeJS/node_modules/mysql/lib/protocol/Protocol.js:52:41)
at Connection.connect (/Users/Admin/IdeaProjects/FirstNodeJS/node_modules/mysql/lib/Connection.js:136:18)
at Object.<anonymous> (/Users/Admin/IdeaProjects/FirstNodeJS/app.js:40:12)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Function.Module.runMain (module.js:441:10)
at startup (node.js:139:18)
I resolve this issue like this
install mysql:
npm install mysql
var mysql = require('mysql');
let connection = mysql.createConnection({
host: 'localhost',
user: 'root',
port: '8888', /* port on which phpmyadmin run */
password: 'root',
database: 'dbname',
socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock' //for mac and linux
});
connection.connect(function(err) {
if (err) {
return console.error('error: ' + err.message);
}
console.log('Connected to the MySQL server.');
});
I resolved my problem by installing MAMP and using fields provided by MAMP.
try this
var connection = mysql.createConnection({
host : 'localhost',
user : 'xxxxx',
password : 'xxxxx',
database : 'xxx'
});
connection.connect();

error connecting/querying mysql node.js and postreSQL

the mysql/node.js appears to connect then i "think" there may be a problem with the query event logic. Here's the code and error. I also have a separate/similar problem with postreSQL. I install npmed both in the same directory.
ryan#\Ryan:~/Desktop/node/datastores$ node MySQL
connection::connected
/home/ryan/Desktop/node/datastores/MySQL.js:20
if (err) throw err;
^
Error: connect ECONNREFUSED
at errnoException (net.js:901:11)
at Object.afterConnect [as oncomplete] (net.js:892:19)
--------------------
at Protocol._enqueue (/home/ryan/Desktop/node/node_modules/mysql/lib/protocol/Protocol.js:135:48)
at Protocol.handshake (/home/ryan/Desktop/node/node_modules/mysql/lib/protocol/Protocol.js:52:41)
at Connection.connect (/home/ryan/Desktop/node/node_modules/mysql/lib/Connection.js:123:18)
at Object.<anonymous> (/home/ryan/Desktop/node/datastores/MySQL.js:15:12)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
this is my server/mysql logic
var mysql = require('mysql');
var connectionConfig = {
host: 'localhost',
user: 'root',
password: '',
database: 'sakila'
};
var connection = mysql.createConnection( connectionConfig);
connection.connect(function(err) {
console.log('connection::connected');
});
connection.query('SELECT * FROM actor', function(err, rows, fields) {
if (err) throw err;
rows.forEach(function(row) {
console.log(row.first_name, row.last_name);
});
});
var actor = { first_name: 'Wil', last_name: 'Wheaton' };
connection.query('INSERT INTO actor SET ?', actor, function(err, results) {
if (err) throw err;
console.log(results);
});
connection.end(function(err) {
console.log('connection::end');
});
heres postre logic
var pg = require('pg');
var connectionString = 'postgres://ryan#localhost/postgres';
var client = new pg.Client(connectionString);
client.connect(function(err) {
if (err) throw err;
client.query('SELECT NOW() AS "THE TIME"', function( err, result ) {
if (err) throw err;
console.log(result.rows[0]);
client.end();
});
});
heres error
ryan#\Ryan:~/Desktop/node/datastores$ node postreSQL
/home/ryan/Desktop/node/datastores/postreSQL.js:8
if (err) throw err;
^
Error: connect ECONNREFUSED
at errnoException (net.js:901:11)
at Object.afterConnect [as oncomplete] (net.js:892:19)
Your password seems to be empty in both connections.
You need to get the connection details for the database from your devOps / SysAdmin / whoever created it.
Ask for the hostname, port, user and password, and schema name; then put those in your init object:
// MySQL:
var connectionConfig = {
host: "", // Hostname + ":" + port (no need for :port if 3360)
user: "", // User
password: "", // Password
database: "" // Schema
};
// PostgreSQL:
var connectionString = 'postgres://user:password#hostname:port';