【问题标题】:loopback remote method return variable other than request data环回远程方法返回请求数据以外的变量
【发布时间】:2017-02-13 23:24:20
【问题描述】:

我有一个通用的 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() 

});

【问题讨论】:

    标签: node.js loopback


    【解决方案1】:

    有几种不同的方法可以做到这一点。因为它恰好是一个 POST 请求,所以我通常会使用 before 远程挂钩将数据附加到正文。

    假设您有一个用于登录用户的模型方法。 假设我们有一个多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 的行可能与我为您显示的完全不一样)。

    如果您想了解更多关于这些内容的信息,我 LoopBack 的 docs 非常不错。自从我上次使用它们以来,它们似乎已经更新,因此我无法将您链接到更有用的页面。我找到了远程方法文档here。

    编辑:我仔细研究了您的问题。您应该能够从context 对象中检索路径并相应地传递数据。我不会尝试编写代码,因为我不知道它在对象中的实际位置。

    【讨论】:

    • 我试图远离钩子,因为会有很多可能性。如果我知道如何获取路线是可以接受的。
    • 据我所知,钩子适用于模型方法而不是远程方法。这意味着您可以拥有任意数量的远程方法,但只有一个钩子。我从未尝试将多个远程方法路由到一个模型,所以我不能确定。
    • 我会补充一点,loopback 有一个名为getCurrentContext(请参阅this)的方法,您可能可以使用它来获取路由。上次我使用这个(一两年前),它有严重的并发问题,所以你应该检查 LoopBack 是否更新过它。
    • 我现在放弃了。 .感谢您的链接,我将在本周末深入挖掘。
    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多