路由get参数和app逻辑

Routing get parameters and app logic

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

我在下面构建了一个用于委托这些请求的函数,称为 queryActionexpress 等平台允许您在 path 级别进行路由,但不能在 res.query 级别进行路由,因为没有路由就无法拥有 res.query

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

这里有一些代码接受查询对象和 returns 一个基于应执行的操作的字符串。

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-router

我将它与 express 一起使用的方式是,我 "catch all" 通过 express.get(/*) 或其他方式的路由,并将该查询通过管道传递给 react-router 处理程序。请查看 this page 以了解有关其工作原理的更多信息。

这允许您将参数路由到不同的视图,将让您使用 express 到 remove/etc React 的 oauth 密钥,并且实际上只是充当 React 组件的中间件。我不确定你所说的 "removing parts from the client before it pushes" 是什么意思,但你肯定可以在渲染组件之前做任何你需要做的事情。