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
HTTP
statusCode

我们尝试了以下代码:

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;
};