路由get参数和app逻辑
Routing get parameters and app logic
我有一个端点 /
,这个端点有时会通过不同的 oAuth 获取参数和登录到应用程序。
我在下面构建了一个用于委托这些请求的函数,称为 queryAction
。 express
等平台允许您在 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 运行ning 服务器端是否可以有仅 运行s 服务器端并从客户端剥离的代码,例如从中删除秘密 oAuth 密钥React 的客户端版本?
- React 是否能够像上面那样将参数路由到不同的视图/操作?
- React 停止成为视图引擎的那一行是什么?
- 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" 是什么意思,但你肯定可以在渲染组件之前做任何你需要做的事情。
我有一个端点 /
,这个端点有时会通过不同的 oAuth 获取参数和登录到应用程序。
我在下面构建了一个用于委托这些请求的函数,称为 queryAction
。 express
等平台允许您在 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 运行ning 服务器端是否可以有仅 运行s 服务器端并从客户端剥离的代码,例如从中删除秘密 oAuth 密钥React 的客户端版本?
- React 是否能够像上面那样将参数路由到不同的视图/操作?
- React 停止成为视图引擎的那一行是什么?
- 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" 是什么意思,但你肯定可以在渲染组件之前做任何你需要做的事情。