2017-02-13 8 views
1

複数のリクエストテンプレートを処理する複数のリモートメソッドを作成する汎用のSendMailルートがあります。 Email_Typeをリモートメソッドから元のルートに戻す方法に関するアイデア。私は、デフォルトでコードを追加することができますが、より洗練されたソリューションを望みます。ループバックのリモートメソッド戻り値のデータ以外の値

Mail.genericSendMail = function genericEmail(response, callback) { 
    console.log(response); 
    let templateId=0; 

    //PROBLEM: HOW TO KNOW WHICH REMOTE WAS USED 

    switch (response.emailType) { 
    case "Template-1": 
     templateId= 1234; 
     break; 
     case "Template-2": 
     tempalteId = 456; 
     break; 
     default: 
     templateId = 789l 
     } //switch 

     console.log(templateId); 
}; 



//Want multiple routes like this to support various templates 
    Mail.remoteMethod("genericEmail", { 
     http: { 
     path: "/emailTemplate1", 
     verb: "POST" 
     }, 
     accepts [ 
     {arg: "request", type:"object",http: {source:"body"}, 
     default: {firstName:"", lastName:"",emailAddress:""} 
     }], 
     returns: RESTResponseStatic.loopbackAdapterCommonRestResponseDefinition() 

    }); 


//Want multiple routes like this to support various templates 
Mail.remoteMethod("genericEmail", { 
    http: { 
    path: "/emailTemplate2", 
    verb: "POST" 
    }, 
    accepts [ 
    {arg: "request", type:"object",http: {source:"body"}, 
    default: {emailAddress:"", promoCode:""} 
    }], 
    returns: RESTResponseStatic.loopbackAdapterCommonRestResponseDefinition() 

}); 

答えて

0

これを行うにはいくつかの方法があります。 POSTリクエストであるので、私は通常、以前のリモートフックを使用してデータを本体に添付します。

ユーザーにログインするためのモデル方法があるとします。 realmプラットフォームが複数あるとします。そのため、ログインしているプラ​​ットフォームを知る必要があります。レルムを使用していない場合や、レルムが分からない場合は心配しないでください。これは、モデルメソッドにデータを設定する方法を示しています。

User.login = function(data, cb) { 
    if (data.realm == 'platform1) { 
    return logUserIntoPlatform1(data, cb); 
    } 

    return logUserIntoDefaultPlatform(data, cb); 
} 

さて、あなたはrealmを送信するために、あなたがモデルにrealmのためのルックアップを行うにはしたくないクライアント/フロントエンドを望んでいないとしましょう。私たちは、そのようbeforeRemoteフックを追加することができます。

User.beforeRemote('login', function (context, user, next) { 
    context.args.data.realm = lookUpRealmSync(context); // 1 
    next(); 
}); 

これはloginメソッドの前に呼び出されます。 next()コールに注意してください。これは実際にモデルメソッドに当たる前にエラー検出を行う方法です。 next({ status: 422, message: 'Parameter missing: password });のようなものはエラーを返し、User.loginメソッドを実行しません。 コンテキストオブジェクトを注意深く見なければならない場合があります(つまり、1とマークされた線は私があなたのために示したように正確に動作しない場合があります)。

この記事について詳しく知りたい場合は、ループバックのdocsはかなり良いです。最後に使用して以来更新されているようですので、より便利なページにリンクすることはできません。私はリモートメソッド文書hereを見つけました。

編集:私はあなたの質問を詳しく見ました。 contextオブジェクトからパスを取得し、それに従ってデータを渡すことができるはずです。私はそれが実際にオブジェクト内にどこにあるのかわからないので、コード化しようとはしません。

+0

非常に多くの可能性があるので、私はフックから離れようとしていました。私が方法を知っていれば、ルートを取得することは受け入れられるでしょう。 – Jim

+1

私が知る限り、フックはモデルメソッドに適用され、リモートメソッドには適用されません。あなたが望むだけ多くのリモートメソッドを持つことができますが、ただ1つのフックを持つことができます。私は1つのモデルに複数のリモートメソッドをルーティングしようとしたことがないので、私はそれを確信することはできません。 –

+1

私はループバックに 'getCurrentContext'というメソッドがあることを付け加えます([this](https://docs.strongloop.com/display/JA/Using+current+context)参照)、これはおそらくルートを取得するのに使うことができます。最後に使ったのは(1〜2年前)、並行処理に問題があったので、LoopBackがそれを更新したかどうかをチェックする必要があります。 –

関連する問題