I am new to NodeJS, but a pretty experienced programmer. I am working on a side project to get my feet wet with node. I am looking at MongoDB for storage. To get started I just wanted to test creating some basic CRUD functions in node. I have included my code below.
My question is regarding the global var 'updated'. It is used in the 'read' and 'update' functions to control which function gets called next. I would like to call them in the following order: create, read, update, read, delete.
It is my understanding that I cannot pass in a function parameter to 'read' to dictate which function to call next because this is called asynchronously and the lambda function I am defining as my callback to mongojs.read will not have the parent functions parameters to use.
What is the correct way to do this? Using a global feels like a hack. :)
// app.js
//<user>:<password>@<server>/<database>
var connection = "foo:bar@127.0.0.1/blah";
var collections = ["scores"]
var db = require("mongojs").connect(connection, collections);
//console.log(db);
var updated = false;
function my_create()
{
console.log("my_create");
db.leaderboard.save({name: "sunder", score: 42}, function(err, result) {
if(err || !result )
{
console.log("Score save failed");
console.log(err);
}
else
{
console.log("Score save successful");
my_read();
}
});
}
function my_read()
{
console.log("my_read");
// app.js
db.leaderboard.find({name: "sunder"}, function(err, results) {
if(err || !results)
{
console.log("Score read failed");
console.log(err);
}
else
{
results.forEach(function(score)
{
console.log(score);
});
// I am sure using globals is a HACK. Need to figure this out.
if(updated)
my_delete();
else
my_update();
}
});
}
function my_update()
{
console.log("my_update");
db.leaderboard.update({name: "sunder"}, {$set: {score: 1337}}, function(err, result) {
if(err || !result)
{
console.log("Score update failed");
}
else
{
console.log("Score update successful");
updated = true;
my_read();
}
});
}
function my_delete()
{
console.log("my_delete");
db.leaderboard.remove({name: "sunder"}, function(err, result) {
if(err || !result)
{
console.log("Score delete failed");
}
else
{
console.log("Score delete successful");
process.exit();
}
});
}
// kick off the flow of processes
my_create();
How about passing the next action to perform into the my_read()
function like this:
// app.js
var connection = "foo:bar@127.0.0.1/blah";
var collections = ["scores"]
var db = require("mongojs").connect(connection, collections);
function my_create()
{
console.log("my_create");
db.leaderboard.save({name: "sunder", score: 42}, function(err, result) {
if(err || !result )
{
console.log("Score save failed");
console.log(err);
}
else
{
console.log("Score save successful");
my_read("update");
}
});
}
function my_read(next_action)
{
console.log("my_read");
// app.js
db.leaderboard.find({name: "sunder"}, function(err, results) {
if(err || !results)
{
console.log("Score read failed");
console.log(err);
}
else
{
results.forEach(function(score)
{
console.log(score);
});
// I am sure using globals is a HACK. Need to figure this out.
if(next_action === "delete")
my_delete();
else
my_update();
}
});
}
function my_update()
{
console.log("my_update");
db.leaderboard.update({name: "sunder"}, {$set: {score: 1337}}, function(err, result) {
if(err || !result)
{
console.log("Score update failed");
}
else
{
console.log("Score update successful");
updated = true;
my_read("delete");
}
});
}
function my_delete()
{
console.log("my_delete");
db.leaderboard.remove({name: "sunder"}, function(err, result) {
if(err || !result)
{
console.log("Score delete failed");
}
else
{
console.log("Score delete successful");
process.exit();
}
});
}
// kick off the flow of processes
my_create();