【问题标题】:Routing get parameters and app logic路由获取参数和app逻辑
【发布时间】:2015-09-18 21:40:41
【问题描述】:

我有一个端点/,这个端点有时会传递不同的 oAuth 获取参数并登录到应用程序。

我在下面构建了一个函数来委派这些请求,称为queryAction。像express 这样的平台允许您在path 级别进行路由,但不能在res.query 级别进行路由,因为没有路由就不能拥有res.query

例如,如果我有/?shop=thomas/?login=thomas&code=7,我会希望用户在app.get("/") 回调中做不同的事情,不同的返回函数。

这里有一些代码接收一个查询对象并根据应该执行的操作返回一个字符串。

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)
}

其中一些函数会执行一些数据库任务或其他异步任务并重定向用户或呈现视图。我很难兼顾 express 应该处理什么(或者如果我什至需要它)和 React 应该处理什么。

  • 因为我希望在服务器端运行相同版本的 React,是否可以有只运行服务器端并从客户端剥离的代码,例如从客户端版本的 react 中删除秘密 oAuth 密钥?
  • React 是否能够像上面那样将参数路由到不同的视图/操作?
  • React 不再是视图引擎的地方是什么?
  • react 是否能够在推送之前渲染出仅服务器端的代码并从客户端移除部分?

【问题讨论】:

    标签: javascript node.js express reactjs isomorphic-javascript


    【解决方案1】:

    这可能无法回答您的个别问题,但您正在寻找的解决方案是react-router

    我将它与express 一起使用的方式是,我通过express.get(/*) 或其他方式“捕获所有”路由,并将该查询传递给react-router 处理程序。请查看this page 了解更多信息。

    这允许您将参数路由到不同的视图,将允许您使用 express 删除/etc 的 React oauth 密钥,并且实际上只是充当您的 React 组件的中间件。我不确定您所说的“在客户端推送之前从客户端移除部件”是什么意思,但您现在可以在渲染组件之前执行您需要做的任何事情。

    【讨论】:

    • 这有帮助。只是仍然没有描绘出全貌。假设 / 应该使用 react 渲染一个登录页面表单,/?user=joseph 应该重定向用户。 express 是否处理所有对/ 的请求的逻辑,如果它有?user=joseph express 是否重定向如果/ 它表达反应?还是应该做出反应做重定向?
    • 好吧,如果你有查询参数,你可以有快速重定向。这很可能仍然是一个反应路由器问题。您将拥有一个用于 / 的 react-router Route,然后在您处理该路由的组件中,您可以获取查询参数以了解 user=joseph
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2021-08-07
    • 2016-12-28
    相关资源
    最近更新 更多