我有一个端点/
,这个端点有时会传递不同的 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 是否能够在推送之前渲染出仅服务器端的代码并从客户端删除部分?