Javascript 在Hapi.js中,我可以重定向到其他端点并设置状态码吗?
如果用户未通过身份验证以查看特定路由(例如:Javascript 在Hapi.js中,我可以重定向到其他端点并设置状态码吗?,javascript,node.js,http,http-status-codes,hapijs,Javascript,Node.js,Http,Http Status Codes,Hapijs,如果用户未通过身份验证以查看特定路由(例如:/admin),则Auth会抛出一个非正统错误,我希望能够重新指向/login,但仍然返回401HTTPstatusCode 我们尝试了以下代码: const statusCode = request.output.payload.statusCode; if(statusCode && statusCode === 401) { return reply.redirect('/login').code(statusCode);
/admin
),则Auth会抛出一个非正统错误,我希望能够重新指向/login
,但仍然返回401
HTTPstatusCode
我们尝试了以下代码:
const statusCode = request.output.payload.statusCode;
if(statusCode && statusCode === 401) {
return reply.redirect('/login').code(statusCode);
}
当我们删除.code(statusCode)
时,重定向会起作用,但理想情况下,我们希望将401
代码返回给客户端,而不是302
(重定向)
或。。。返回302
是否为“最佳实践”
上下文:我们正在开发一个小的(可重复使用的)插件来处理我们的Hapi应用程序/API中的错误,其中一个功能是在身份验证失败时将重定向到/login
。请看:我们希望它“正确”,以便其他人可以使用它
以下是引起你悲伤的HapiJS来源(lib/response.js:320):
如您所见,通过使用reply.redirect()
Hapi已经在回复302代码。您需要决定是在前端使用401和重定向进行回复,还是使用Hapi重定向并接受它符合协议标准
作为对最佳实践位的回答,是的,Hapi所做的正是服务器强制重定向(302重定向)时所期望的。为了使用401响应,最佳实践是在客户端重定向,就像您只是正常导航到路由一样
作为参考,reply.redirect()函数定义(lib/reply.js:145)简单如下
返回此.response(“”).redirect(位置)代码>
编辑12月16日:Kelly Milligan在下面指出,HapiJS现在支持使用reply.redirect().code()
,如果您不想发送302状态,则不会发送它。以下是引起您悲伤的HapiJS源代码(lib/response.js:320):
如您所见,通过使用reply.redirect()
Hapi已经在回复302代码。您需要决定是在前端使用401和重定向进行回复,还是使用Hapi重定向并接受它符合协议标准
作为对最佳实践位的回答,是的,Hapi所做的正是服务器强制重定向(302重定向)时所期望的。为了使用401响应,最佳实践是在客户端重定向,就像您只是正常导航到路由一样
作为参考,reply.redirect()函数定义(lib/reply.js:145)简单如下
返回此.response(“”).redirect(位置)代码>
编辑12月16日:Kelly Milligan在下面指出,HapiJS现在支持使用reply.redirect().code()
,如果您不希望,它不会发送302状态。考虑到您的上下文添加,我对最佳实践的回应仍然是我关于您应该如何实现的立场。当您重定向用户时,用401回复是不符合HTTP规范的,因为您自己正在处理未经授权的访问错误。老实说,302的使用也是不正确的(Hapi应该使用303,请参阅其他),但它已经被web社区接受了很长时间,因此被认为是正常的。考虑到您的上下文添加,我对最佳实践的回应仍然是我对您应该如何实施的立场。当您重定向用户时,用401回复是不符合HTTP规范的,因为您自己正在处理未经授权的访问错误。老实说,302的使用也是不正确的(Hapi应该使用303,请参见其他),但它已经被web社区接受了很长时间,因此被认为是正常的。
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;
};