在Hapi.js中,我可以重定向到不同的端点并设置statusCode吗?

时间:2016-08-24 16:29:57

标签: javascript node.js http http-status-codes hapijs

如果未对用户进行身份验证以查看特定路由(例如:/admin),则Auth会发出Boom unorthorized错误,我希望能够重定向到/login,但仍然返回401 HTTP statusCode

我们尝试了以下代码:

const statusCode =  request.output.payload.statusCode;

if(statusCode && statusCode === 401) {
  return reply.redirect('/login').code(statusCode);
}

重定向在我们移除.code(statusCode)时有效,但我们 以返回401代码客户端不是302重定向

......是" 最佳做法 "返回302 ...?

  

上下文:我们正在开发一个小的(可重用的)插件来处理Hapi App / API中的错误,其中一个功能是redirect/login当auth失败时,请参阅:https://github.com/dwyl/hapi-error#redirecting-to-another-endpoint,我们希望得到它" 正确"所以其他人可以使用它!

1 个答案:

答案 0 :(得分:4)

这是导致你悲痛的HapiJS来源(lib / response.js:320):

QScriptEngine#newActivationObject()

如您所见,使用internals.Response.prototype.redirect = function (location) { this.statusCode = 302; this.location(location); this.temporary = this._temporary; this.permanent = this._permanent; this.rewritable = this._rewritable; return this; }; Hapi已经回复了302代码。您需要决定是否在前端回复401和重定向,或者使用Hapi重定向并接受它符合协议标准。

作为对最佳实践的回答,是的,Hapi正在完成服务器强制重定向(302重定向)时的预期。为了使用401响应,最佳做法是在客户端重定向,就像您只是正常导航到路由一样。

作为参考,reply.redirect()函数定义(lib / reply.js:145)只是

reply.redirect()

编辑Dec '16:下面的Kelly Milligan指出,HapiJS现在支持使用return this.response('').redirect(location);,如果你不想要它,则不会发送302状态。