2017-02-13 5 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, может работать не так, как я показал вам).

Если вы хотите узнать больше об этой вещи, я LoopBack-х docs довольно хорошо. Кажется, они были обновлены с тех пор, как я их последний раз использовал, поэтому я не могу связать вас с более полезными страницами. Однако я нашел документацию удаленного метода here.

Edit: Я присмотрелся на ваш вопрос. Вы должны иметь возможность получить путь от объекта context и передать данные соответствующим образом. Я не собираюсь пытаться закодировать это, так как я не знаю, где он на самом деле находится внутри объекта.

+0

Я пытался остаться с крючками, так как было бы так много возможностей. Получение маршрута было бы приемлемым, если бы я знал, как это сделать. – Jim

+1

Насколько я знаю, крючок применим к методу модели, а не к удаленному методу. Это означает, что у вас может быть столько удаленных методов, сколько нужно, а всего лишь один крючок. Я никогда не пытался маршрутизировать несколько удаленных методов на одну модель, поэтому я не могу быть уверен в этом. –

+1

Я добавлю, что loopback имеет метод, называемый 'getCurrentContext' (см. [This] (https://docs.strongloop.com/display/JA/Using+current+context)), который вы, вероятно, могли бы использовать для получения маршрута , Последнее, что я использовал (год или два назад), у него были неприятные проблемы с параллелизмом, поэтому вы должны проверить, обновил ли LoopBack его. –