I am trying a nodejs mysql wrapper which I got from here.Everything is working including the setup and connection. But when I try saving a piece of data into the table, I get the error Object #<Object> has no method 'table'. When I just console the db object,I get the object, no error.
Can someone tell what I miss here ?
my global.js
//connect to mysql
var mysql = require('mysql');
var connection = mysql.createConnection({host : 'xxx.xxx.xxx.xxx', user : 'xxxx', password : 'xxxx', database : 'xxxx' });
connection.connect();
var wrapper = require('node-mysql-wrapper');
var db = wrapper.wrap(connection);
exports.db = db;
my app.js
var db = require('./global.js');
db.table('my_table').save( my_data_object );
The problem is that you're exporting a separate property instead of exporting directly. So either change exports.db = db to module.exports = db or change var db = require('./global.js') to var db = require('./global.js').db.
Additionally, you are referencing global.js instead of config.js as you show in your question, so depending on whether or not that is a typo, that could be another issue.
Related
first sorry for my english ;)
second my question :
describtion :
I have :
var mongoose = require('mongoose');
// define the schema for our user model
var userSchema = mongoose.Schema({
facebook : {
id : String,
token : String,
email : String,
name : String
}
});
// create the model for users and expose it to our app
module.exports = mongoose.model('User', userSchema);
to use it with passport on a node.js .
...
var User = require('../app/models/user');
i dont connect to mongodb , since i use mysql to store my sessions .
the only stuff i dont understand is the _id value , comes it from passport , or sessions ?
question :
what i have todo to get a user model (object) so it is working together with passport/session ? or are there some method i need anyway , so it is better to get the user model from mongoose ?
sincerley rakondark
The id (known as the ObjectId) is generated and set by MongoDB for each documents.
I believe it auto-increments while using MySQL for passport.
I am trying to learn node.js so that I can actually get started on working on my personal project. I have been trying to follow the examples in the book "Learning node.js" (by Marc Wandschneider). I, at this point, decided to forgo practicing his example, and go straight into using his code as framework for my practice code.
In my practice code, all I am trying to do is connect to my RDS database (no, I am not using Elastic Beanstalk, btw), and output contents of one of the tables. Seems simple enough, but when I whip up the code for it (based on the book), it seems to attempt connection, but get hung up in the process. This is my code:
var pool = require('generic-pool');
var async = require('async');
var mysql = require('mysql');
var host = "<database-name>.cu8hvhstcity.us-west-2.rds.amazonaws.com",
database = "<database-name>",
user = "<username>",
password = "<someLongPassword>";
var dbClient;
async.waterfall([
// 1. establish connection to database
function (callback) {
console.log("Connecting to database " + database + "...");
dbClient = mysql.createConnection({
host: host,
database: database,
user: user,
password: password,
port: 3306
});
dbClient.connect();
},
// 2. select all from a table (let's go for locations)
function (cb)
{
var query = "SELECT * FROM locations"
console.log("running query \"" + query + "\"...");
dbClient.query(query, cb);
},
function (rows, fields, callback)
{
console.log(fields);
for (var i = 0; i < rows.length; i++)
{
console.log(JSON.stringify(rows, null, '\t'));
}
}
], function (err, results) {
if (err)
{
console.log("An error occurred...");
console.log(err);
}
else
{
console.log("Everything successfully completed!");
}
dbClient.end();
})
This is better than first attempt, when I put a database member to the argument passed to mysql.createConnection(), and it complained that database was unknown. In neither case did either "An error occurred..." nor "Everything successfully completed!" output to the window.
Is there any async stuff going on that is resulting in some kind of non-terminating infinite loop or something? How do I fix this?
The book has an associated GitHub page
NOTE:
Neither my example nor the cited GitHub code make use of that pool variable, so it can simply be commented out. All you need to do to run this yourself is to say npm install async,npm install mysql (as well as creating a dummy RDS database to point to, that contains locations table) before copying, pasting, and running this code.
EDIT:
I fixed the issue with database. I realized that the name of the database used '_', not '-'. Same issue (code hangs) still persists...
I did the following:
In the second function in the array, I needed two parameters, not one.
I fixed thus:function(results, cb)
The third function simply needed to callback(null)
I have a nodejs server in Openshift with a MySQL cartridge. It seems to build with no problem, however, when I try to query the database, it seems to be doing nothing... It doesn't even give me an error, it's just does nothing. Here's my relevant code.
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'mysql://' + process.env.OPENSHIFT_MYSQL_DB_HOST + ':' + process.env.OPENSHIFT_MYSQL_DB_PORT + '/',
user: process.env.OPENSHIFT_MYSQL_DB_USERNAME,
password: process.env.OPENSHIFT_MYSQL_DB_PASSWORD,
database: 'revision',
multipleStatements: true,
debug : true
});
And in the appropriate route:
var stuff = 'abc';
connection.query('SELECT 1', function(err, rows, fields){
if (err) {
stuff = "ghi";
} else {
stuff = "def";
}
});
stuff = stuff + "done";
res.send(JSON.stringify(stuff));
It should return "defdone" or "ghidone", but it always returns "abcdone"... It's like it doesn't even get inside the function. I've tried several ways of doing this and none work. I've dumped the connection variable and it seems to be what's meant to be.
The reason I'm using SELECT 1 as the query string was to verify it was not a database error.
It seems the "issue" had to do with the asynchronous nature of node, as the final 2 instructions are executed before the query is completed. Furthermore, the configs seemed to be wrong after all, as I only had a "host" attribute with the whole url. I changed it into to 2 attributes - "host and "port", giving them the appropriate variables (process.env.OPENSHIFT_MYSQL_DB_HOST and process.env.OPENSHIFT_MYSQL_DB_PORT). It's working now!
I'm just getting into coding server side javascript and have been reading tutorials on socket.io and node.js, but I haven't come across anything demonstrating how to use node.js to access a mysql database.
Say for instance I want to create a method that listens to a table in my database at
mysql.something.com (with database: database, username: username, etc), how would
I get socket.io with node.js to connect to that database and listen for new input to that table and then subsequently return that input?
I'm wondering if anyone could give me a specific example that uses a publish subscribe model.
Thanks for the help.
You have to poll mysql database for changes at regular interval and when detect a change emit a socket.io event. Here's a pseudo code
var mysql = require('mysql');
var connect = mysql.createConnection({
host: 'localhost'
, database: 'your_database'
, username: 'user'
, password: 'password'});
var initial_result;
// check for changes after 1 second
setTimeout(function(){
connect.query('select * from your_table', function(err, result) {
if(err) { throw new Error('Failed');}
initial_result = initial_result || result;
if(Changed(initial_result, result)) { socket.emit('changed', result); }
});
function Changed(pre, now) {
// return true if pre != now
}
}, 1000);
I've begun playing around with Node.js lately, for many reasons but most importantly the ease at which I can write a chat-server utilising HTML5 WebSockets. However, I've been stuck for weeks with MySQL.
I'm currently using this MySQL client module: https://github.com/sidorares/nodejs-mysql-native
I've connected to the database and managed to store data using the following code:
// MySQL database
var db = require("mysql-native").createTCPClient(); // localhost:3306 by default
db.auto_prepare = true;
db.auth(dbName, dbUser, dbPass);
// Update the database
db.execute("UPDATE server_data SET value='" + new Date() + "' WHERE name='lastLoaded'");
How may I go about retrieving data from the database using a SELECT * FROM x WHERE y=z query?
Is there any specific reason you chose nodejs-mysql-native over node-mysql which is a really good node module. If there is none, then you should probably try node-mysql. I've tried it and it is great to start off using MySQL with Node. You could do something like:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'your_username',
password : 'your_password',
});
connection.connect();
connection.query("UPDATE server_data SET value=? WHERE name=?", [new Date(), 'lastLoaded'] function(err, result) {
if (err) throw err;
console.log('Result: ', result);
});
connection.end();
The advantage you get by using it this way is that you can prevent SQL injection, which is taken care of internally in node-mysql (by using the connection.escape() method).