2017-03-16 11 views
0

私はコールバックを返すよりも何らかの処理を行うルートを持っています。 LoginCallBackのfucntionは、オブジェクトの解像度を知らない -node.jsコールバックデザイン - コールバックでresを使用する方法

loginCallback(result); 

私の質問は:ユーザー/パスは、データベースとリターンに存在する場合

router.get('/login', function(req,res,next) { 
    // send call to login function. 
    var ID= req.query.ID; 
    var Password = req.query.Password 

    ctlLogin.login(ID,Password, LoginCallback); 



}); 

function LoginCallback(err,myLoginResult) 
{ 
    res.json(myLoginResult); 
} 

ログイン機能チェック: はここのコードです。 コールバック関数へのパラメータとして私を渡してもらうためにログインモジュールに渡すことができますが、悪い設計のように思われます。コールバック関数をloginメソッドに送る必要があるだけです。

これを行うには良い方法がありますが、それでも読み込み可能なコードはありますか?

+0

十分な私はログインメソッドにコールバック関数を送信する必要がある "*なぜですか? – 4castle

+0

私は同調的に動作すると思います。 – Dani

+0

私の意図したことは、なぜあなたはコールバックが悪いデザインだと思いますか?彼らはかなり標準的ですが、もしあなたが代案を望むなら、約束を返すことができます。 – 4castle

答えて

1

私は最善のアプローチは、このコードのスニペットを使用することだと思います。この場合は

ctlLogin.login(ID,Password, function(myLoginResult){ 

      res.json(myloginResult); 

    }); 

あなたのログイン機能では、このようなものが必要です:あなたが独自に作成することができます

login(ID, Password, callback){ 
     //your treatment here 
     callback(result) 


    } 
+0

私は、このネストされたフォームをコーディングするのを避けようとしています。私は私のバージョンは同等ですが、私はそれがないと思います... – Dani

1

を別の機能でログインを処理するためのミドルウェアです。あなたは私がポストルートapp.get('/login', login, func...で関数を挿入していることがわかります

var app = require('express')(); 
var bodyParser = require('body-parser'); 

app.use(bodyParser.json()); 

function login(req, res, next) { 
    // login check 
    console.log(req.query); 
    if(req.query.ID === '1' && req.query.Password === 'password') { 
     return next(); 
    } 

    // if check above is false 
    res.send({success: false}); 
} 

app.get('/login', login, function (req, res, next) { 
    res.send({success: true}); 
}) 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}) 

:ここで私はあなたのために作成したシンプルな急行アプリです。

これらのURLパラメータhttp://localhost:3000/login?ID=1&Password=passwordを使用してページにアクセスすると、成功メッセージが表示されます。パラメータ名または値のいずれかを変更すると、成功を返します。false。

あなたは次のreq、解像度とは、スコープの外に彼らがアクセスすることはできませんされているように、あなたは関数のスコープ(reqは、RES、次)のうち、loginCallbackを使用している独自のExpress Custom Middleware

+0

非常に興味深い、記事参照のおかげで。 – Dani

1

を作るの詳細をお読みください。あなたは

router.get('/login', function(req,res,next) { 
    // send call to login function. 
    var ID= req.query.ID; 
    var Password = req.query.Password 

    function LoginCallback(err,myLoginResult){ 
    res.json(myLoginResult); 
    } 

    ctlLogin.login(ID,Password, LoginCallback); 
}); 

または

のようなこのへのアクセスを持つことができctlLoginは、機能対応無しの約束あなたが代わりにコールバック

ctlLogin.login(ID,Password) 
    .then(LoginCallback) 
    .catch(console.log(err)) 

の約束を使用できるかどうか、関数のスコープ(reqは、解像度のうち、LoginCallback機能が必要な場合は、次に、コールバック関数を作成して関数にresを渡し、error、resultsとres、またはuse bindを渡してLoginCallback関数を呼び出す必要があります。

function sendResponseToSever(res, err, myLoginResult){ 
    if(err){ 
     return res.send({ 
       errors: err, 
       status: 500 // what ever status code you want to set 
     }); 
    } 
    return res.json(results); 
} 

    router.get('/login', function(req,res,next) { 
    // send call to login function. 
    var ID= req.query.ID; 
    var Password = req.query.Password  

    ctlLogin.login(ID,Password, sendResponseToSever.bind(null, res) 
     //using bind function 
     // OR 
    ctlLogin.login(ID,Password, function(err, myLoginResult){ 
     sendResponseToSever(err, myLoginResult, res); 
     // now sendResponseToSever is a generic function which you can call 
     // from any route 
    });   
    }); 
}); 

最も好ましい方法は、コールバック地獄を避けたい場合は約束の使用です。 あなたが言及したように、あなたはそれを避けることができますネスティングを避けるために約束を使用してください。

あなたは(私たちは約束し、他の難しいものを使用してスキップする場合)私はあなたのケースで使用するソリューションは、コンテキストに機能を結合された約束

1

を知りたい場合https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promiseを参照してください。 ほとんどの場合、オブジェクトメソッドをコールバックとして使用するときにオブジェクトコンテキストを保持するために使用されますが、元のものよりも引数の少ない関数を作成するためにも使用されます(curryingとも呼ばれます)。

javascriptでは、どのような関数でもメソッドbindを使用してコンテキストをバインドできます。最初のパラメータは、関数呼び出し中のthisの値であり、その他は引数値です。

あなたのコードはbindを使用して書き直し:

router.get('/login', function(req,res,next) { 
    // send call to login function. 
    var ID= req.query.ID; 
    var Password = req.query.Password 

    ctlLogin.login(ID,Password, LoginCallback.bind(null, res)); 
}); 

function LoginCallback(res, err, myLoginResult) 
{ 
    res.json(myLoginResult); 
} 

`` `

1

これは非常に少ないリファクタリングとの約束を使用して、よりreadableコードに簡単に再構築することができます:それは悪いのです」*

router.get('/login', function(req,res,next) { 
    // send call to login function. 
    var ID= req.query.ID; 
    var Password = req.query.Password 

    ctlLogin.login(ID,Password) 
     .then((result) => { 
     // handle success 
     }) 
     .catch((err) => { 
     // handle failure 
     }) 
}); 



function Login(ID, password) { 
    return new Promise(resolve, reject) { 
     // run your query using a library that supports promises 
     .then((result) => resolve(result)) 
     .catch((err) => { 
      //handle your error 
      reject(err) 
     }) 
    } 
} 
関連する問題