2017-02-13 55 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方法之前被调用。请注意0​​调用:这是您在实际触及模型方法之前可以执行错误检测的方式。类似next({ status: 422, message: 'Parameter missing: password });会返回错误并且不执行User.login方法。 您可能必须仔细查看您的上下文对象(即,标有1的行可能无法完全按照我为您显示的那样工作)。

如果你想阅读更多关于这个东西,我LoopBack的docs是相当不错的。自从我上次使用它们以来,它们似乎已经更新,因此我无法将您链接到更有用的页面。不过,我发现远程方法文档here

编辑:我仔细看看你的问题。您应该能够从context对象中检索路径并相应地传递数据。我不会去尝试编码,因为我不知道它实际上在对象内的什么位置。

+0

我试图从钩子留下,因为会有这么多的可能性。如果我知道如何获得路线是可以接受的。 – Jim

+1

据我所知,钩子将应用于模型方法而不是远程方法。意思是你可以有任意多的远程方法,但只需要一个钩子。我从来没有尝试将多个远程方法路由到一个模型,所以我不能确定。 –

+1

我会补充一点,loopback有一个名为'getCurrentContext'的方法(参见[this](https://docs.strongloop.com/display/JA/Using+current+context)),你可以用它来获取路由。最后我使用了这个(一年或两年前),它有讨厌的并发问题,所以你应该检查LoopBack是否更新过。 –

相关问题