2012-08-05 70 views
2

我是NodeJS的新手,但是經驗豐富的程序員。我正在開展一個側面項目,讓我的腳與節點保持一致。我正在查看MongoDB的存儲。要開始我只想測試在節點中創建一些基本的CRUD函數。我在下面列出了我的代碼。nodejs使用globals

我的問題是關於全局var'updated'。它用於「讀取」和「更新」功能來控制接下來調用哪個函數。我想按照以下順序調用它們:創建,讀取,更新,讀取,刪除。

這是我的理解是,我不能傳入一個函數參數來'讀'來決定下一個要調用的函數,因爲這是異步調用的,我定義的lambda函數作爲我的回調mongojs.read將不會父函數參數使用。

這樣做的正確方法是什麼?使用全局感覺就像是黑客。 :)

// app.js 
//<user>:<password>@<server>/<database> 
var connection = "foo:[email protected]/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(); 

回答

0

如何通過下一步的行動進行到my_read()功能是這樣的:

// app.js 
var connection = "foo:[email protected]/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();