2012-02-15 25 views
0

私は、転送部分のexpressとnodeJS REST APIサーバーを作成しています。サーバーが行うことの一部は、さまざまな種類のデータをバックアップすることです。サポートする特定の種類のデータと、サポートしているすべての要求をバックアップする要求があります。コードの重複を節約するため、私はすべてのバックアップを処理する要求からすべてのbackup-individual-types-of-data関数を呼び出すことを考えていました。NodeJSサーバーのコールバック

データバックアップ機能の個々のタイプ。

function verifyUserId(req, res, functionToGoTo) { 

    req.mongoClient.collection('syncServiceAccounts', checkForAccount = function (err, collection) { 
     collection.find({_id:req.objectID.createFromHexString(req.params.syncServiceUser)}).toArray(function (err, results) { 
      if (results.length != 0) { 
       functionToGoTo(req, res, results[0].share_key); 
      } else { 
       res.send(404); 
      } 
     }); 
    }); 
}; 
    //Set all server contacts as on device 
exports.syncServiceContactsSync = function (req, res) { 
    console.log('syncServiceContactsSync'); 
    verifyUserId(req, res, syncServiceContactsSync, sendContactsSyncResponse); 
    //verifyUserId(req, res, syncServiceContactsSync); 
}; 
function syncServiceContactsSync(req, res, shareKey, callback) { 
//function syncServiceContactsSync(req, res, shareKey) { 
    jsonObject = (req.body); 
    var jsonResponse = new Array(); 

    req.mongoClient.collection('syncService_Contacts', insertSyncServiceUser = function (err, collection) { 
     collection.remove({share_key:shareKey}); 

     for (var i = 0; i < jsonObject.length; i++) { 
      jsonObject[i].share_key = shareKey; 
      collection.insert(jsonObject[i]); 
     } 

     collection.find({share_key:shareKey}).toArray(function (err, results) { 
      for (var i = 0; i < results.length; i++) { 
       jsonResponse.push({contactID:results[i]._id}); 
      } 
      //res.json(jsonResponse, 200); 
      callback(); 
     }); 
    }); 
}; 
function sendContactsSyncResponse() { 
    res.json(jsonResponse, 200); 
} 

次の機能では、すべての個々のバックアップタイプを呼び出すことができます。

//Set all server items as on the device 
exports.syncServiceSync = function (req, res) { 
    console.log('syncServiceSync'); 
    contactsObj = new Contacts(); 
    contactsObj.syncService 

}; 

私は、エクスポートsyncServiceContacsSyncを呼び出すことができ、それはデータの種類ごとに同等だが、私はsyncServiceSyncから一度それを行うことができたとき、私は、データのそれぞれの新しいタイプのユーザーIDを確認したいです。それを行う方法はありますか?syncServiceContactsSyncにデータを挿入したらどうするか教えてください。それは、jsonResponseと一緒に次のデータ型にカスケードする関数に行くことが好ましいでしょう。

また、2つのファイルブロックが同じフォルダ内の異なるファイルに存在することにも注意してください。

編集:わかりやすくするために。私はデータ型A、B、Cを自分のmongoコレクションにバックアップするシステムを持っています。私は私のアプリの登録ユーザーのための別のコレクションを持っています。リクエストに関しては、A、B、Cを個別にバックアップするものと、特定のユーザーアカウントのすべてを処理するものがあります。それらすべてを扱うものでは、A、B、Cをバックアップする関数を使うのは良い考えだと思ったので、コードの重複はありません。その結果、私が好きなもの(しかし、別の方法で実装されてしまうかもしれません)は、すべてのデータタイプをバックアップしたいときは、単にAを扱うものを呼び出して、そのデータ型にカスケードしますBを扱うものとCを持つものを扱うものです。単に各関数にカスケードするだけでなく、いくつかのデータ(リソースID、AsのID、Bsを扱う関数にカスケードし、次にIDのID AとBをCを扱うものに変換し、最後にこれらのIDをすべて返す関数に変換します)。私が持っている問題は、カスケードするたびにコードが書かれているということです。私はユーザコレクション内でそのユーザを見つけることができるかどうか再確認したいと思います。それはちょっとばかげたことです。

答えて

0

私はあなたの質問を完全に理解していますが、Expressルートで利用可能なRoute Middlewareを調べましたか?詳細はhttp://expressjs.com/guide.html#route-middlewareにあります。

基本的に、要求パイプラインにロジックを挿入できるため、ロジックを1か所で定義し、複数のルートで使用することができます。

function loadUser(req, res, next) { 
    // You would fetch your user from the db 
    var user = users[req.params.id]; 
    if (user) { 
    req.user = user; 
    next(); 
    } else { 
    next(new Error('Failed to load user ' + req.params.id)); 
    } 
} 

app.get('/user/:id', loadUser, function(req, res){ 
    res.send('Viewing user ' + req.user.name); 
}); 
+0

もしそうなった場合は、これをあなたの質問の回答としてマークしてください。 – Bill

+0

うん、そうです、心配しないでください。 –

+0

@Billあなたの例から、次の(新しいエラー(...))がapp.get( '/ user /:id')関数にどのように流入するのかは明らかではありません。 next()に渡されたエラーを取得するにはどうすればよいですか?この例で言及されていることを見るとよいでしょう。 – titusmagnus

関連する問題