路由获取参数和应用逻辑

时间:2015-07-01 15:58:43

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

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

我已经建立了一个功能,用于委托以下名为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)
}

其中一些函数将执行某些数据库任务或其他异步任务,并重定向用户或呈现视图。我很难处理快递应该处理的事情(或者我是否需要它)以及React应该处理什么。

  • 因为我想要运行服务器端的相同版本的React可以存在只运行服务器端并被剥离出客户端的代码,比如从客户端版本的react中删除秘密的oAuth密钥?
  • React是否能够将params路由到不同的视图/操作,如上所述?
  • React停止作为视图引擎的行是什么?
  • 是否能够在推送之前呈现出服务器端代码并​​从客户端删除部件?

1 个答案:

答案 0 :(得分:2)

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

我在express中使用它的方式是我能够抓住所有"通过express.get(/*)或其他路由的路由,以及查询到react-router处理程序的管道。请查看this page以获取有关其工作原理的更多信息。

这允许您将params路由到不同的视图,让您使用express来删除React的/ etc oauth键,并且实际上只是充当React组件的中间件。我不确定你是什么意思"在推送之前从客户端移除部件"但是在渲染组件之前,你可以在这一点上做任何你需要的事情。