2015-07-01 2 views
0

У меня есть конечная точка /, и эта конечная точка получает в разное время различные параметры для oAuth и вход в приложение.Маршрутизация получить параметры и логика приложения

Я создал функцию для делегирования этих запросов под названием queryAction. Платформы, такие как express, позволяют вам маршрутизировать на уровне path, но не на уровень res.query, потому что вы не можете иметь res.query без маршрута.

Например, если у меня есть /?shop=thomas и /?login=thomas&code=7 Я хочу, чтобы пользователь выполнял разные вещи, разные возвращаемые функции в обратном вызове .

Вот код, который принимает объект запроса и возвращает строку, основанную на действиях.

function queryAction(query, secret){ 
    query = (query) ? query : {} 
    var signature = checkSignature(query, secret) 
    var timestamp = checkTimestamp(query) 
    var valid = signature && timestamp 
    var hasInstallParams = _.hasOnly(query, ["code","shop","timestamp","signature"]) 
    var hasErrorParams = _.hasOnly(query, ["error","shop","timestamp","signature"]) 
    var hasErrorDescParams = _.hasOnly(query, ["error","error_description","shop","timestamp","signature"]) 
    if(!_.size(query)) return "view" // show shop login form 
    if(_.hasOnly(query, ["shop"])) return "shop" // redirect to login 
    if(_.hasOnly(query, ["charge_id"])) return "charge" 
    if(hasInstallParams && valid) return "installed" 
    if(hasInstallParams && !valid) return "installed_invalid_timestamp_and_signature" 
    if(hasInstallParams && !signature) return "installed_invalid_signature" 
    if(hasInstallParams && !timestamp) return "installed_invalid_timestamp" 
    if(hasErrorParams && query.error == "access_denied" && valid) return "install_canceled" 
    if(hasErrorParams && query.error == "access_denied" && !signature) return "install_canceled_invalid_signature" 
    if(hasErrorParams && query.error == "access_denied" && !timestamp) return "install_canceled_invalid_timestamp" 
    if(hasErrorParams && query.error == "access_denied" && !valid) return "install_canceled_invalid_timestamp_and_signature" 
    if(hasErrorParams && query.error == "invalid_request" && valid) return "invalid_request" 
    if(hasErrorParams && query.error == "invalid_request" && !signature) return "invalid_request_invalid_signature" 
    if(hasErrorParams && query.error == "invalid_request" && !timestamp) return "invalid_request_invalid_timestamp" 
    if(hasErrorParams && query.error == "invalid_request" && !valid) return "invalid_request_invalid_timestamp_and_signature" 
    if(hasErrorDescParams && query.error == "invalid_scope" && valid) return "invalid_scope" 
    if(hasErrorDescParams && query.error == "invalid_scope" && !signature) return "invalid_scope_invalid_signature" 
    if(hasErrorDescParams && query.error == "invalid_scope" && !timestamp) return "invalid_scope_invalid_timestamp" 
    if(hasErrorDescParams && query.error == "invalid_scope" && !valid) return "invalid_scope_invalid_timestamp_and_signature" 
    return "undefined_action" 
} 

С помощью этого кода я могу проверить, существует ли соответствующая функция и запустить ее, например.

app.get("/", function(res, req, next){ 
    var action = queryAction() 
    if(actions[action]) return actions[action](req, res) 
    return next(action) 
} 

Некоторые из этих функций выполняют какую-либо задачу базы данных или другую асинхронную задачу и перенаправляют пользователя или отображают представление. Мне трудно манипулировать тем, что должен делать экспресс (или, если мне это даже нужно), и то, что должен реагировать.

  • Потому что я хочу ту же версию React работает на стороне сервера может существовать код, который работает только на стороне сервера и раздели из клиента, как удаление секретных ключей OAuth с клиентской стороны версии реагировать?
  • Is React способен перенаправлять параметры на разные виды/действия, например, выше?
  • Какая линия, где React перестает быть механизмом просмотра?
  • Является ли реагирование способным отображать только код на стороне сервера и удалять части из клиента до его нажатия?

ответ

2

Это может не отвечать на ваши индивидуальные вопросы, но решение, которое вы ищете, это react-router.

Способ, которым я использовал его с express, заключается в том, что я «поймаю все» маршруты через express.get(/*) или что угодно, и запрошу трубку до обработчика react-router. Пожалуйста, просмотрите this page для получения дополнительной информации о том, как это работает.

Это позволяет вам перенаправлять параметры на разные виды, позволит вам использовать express для удаления/etc oauth ключей для React и действительно просто действовать как промежуточное программное обеспечение для ваших компонентов React. Я не уверен, что вы подразумеваете под «удалением частей из клиента перед тем, как он толкает», но вы, безусловно, можете сделать все, что вам нужно, на этом этапе, прежде чем визуализировать компонент.

+0

Это помогает. По-прежнему не рисует полную картину. Предположим, что '/' должен отображать форму страницы входа в систему, и '/? User = joseph' должен перенаправить пользователя. Является ли выражать handel логику для всего запроса '/', и если у него есть '? User = joseph' express, перенаправление, если'/'он выражает, реагирует? Или нужно реагировать на перенаправление? – ThomasReggi

+0

Ну, вы могли бы выразить перенаправление, если у вас есть параметры запроса. Это, скорее всего, все равно будет проблемой реактивного маршрутизатора. У вас должен быть маршрутизатор-ответ «Маршрут» для '/', а затем в компоненте, который вы обрабатываете этот маршрут, вы можете получить параметры запроса, чтобы узнать, что 'user = joseph' –

Смежные вопросы