サーバーサイドコーディングにNode.jsとExpressjsを使用し、バックエンドとしてMongoDBを使用しています。私はこれらすべてのテクノロジーに不慣れです。リクエストに基づいてアクションのリストを作成する必要があります。
たとえば、ユーザー管理で
- すでに登録されているユーザーを確認してください
- 登録されている場合は、アクティベーションメールを再送信してください
- 登録されていない場合は、ユーザー、アセットなどのIDを維持する別のテーブルからuserIdを取得します。[MongoDBが一意の_idを提供することはわかっています。しかし、userIdとして一意の整数IDが必要です]
- ユーザーを作成する
- 成功または失敗の応答を送信します。
これを実装するために、私は次のコードを書きました:
exports.register = function(req,res,state,_this,callback) {
switch(state) {
case 1: //check user already registered or not
_this.checkUser(req, res, ( state + 1 ), _this, _this.register, callback);
break;
case 2: //Already registered user so resend the activation email
_this.resendEmail(req, res, 200, _this, _this.register, callback);
break;
case 3: //not registered user so get the userId from another table that will maintain the ids for user,assets etc
_this.getSysIds(req, res, ( state + 2 ), _this, _this.register, callback);
break;
case 4: //create the entry in user table
_this.createUser(req, res, ( state + 1 ), _this, _this.register, callback);
break;
case 200: //Create Success Response
callback(true);
break;
case 101://Error
callback(false);
break;
default:
callback(false);
break;
}
};
チェックユーザーコードは次のようなものです
exports.checkUser = function(req,res,state,_this,next,callback) {
//check user already registered or not
if(user) {//Already registered user so resend the activation email
next(req,res,state,_this,callback);
}
else {//not registered user so get the userId
next(req,res,(state + 1),_this,callback);
}
}
そして同様に他の機能。
register関数の最初の呼び出しは、app.getから実行されます。
user.register(req,res,1,this,function(status) {
//do somthing
});
これを行うためのより良い方法はありますか?私が直面している問題は、一連の行動に従わなければならないいくつかの条件に基づいています。これらすべてをネストされたコールバック構造で記述できますが、その場合、コードを再利用することはできません。
上司が私に言った問題の1つは、コードで関数レジスタを呼び出して、コールバックのスタックに次のように配置することでした。
状態1:chekuser
状態3:getIds
状態4:ユーザーの作成
そして最後に状態200になり、ここでスタックを終了しますか?スタックオーバーフローを引き起こす可能性があります!
Node.js / Expressjsでコールバックを処理するためのより良い方法はありますか?
注:上記はサンプルコードです。このようなさまざまな状況があります。