You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HapiJS中为404错误响应设置Access-Control-Allow-Origin?

解决HapiJS 404错误响应缺失CORS头的问题

这个问题我之前折腾Hapi的时候也碰到过,其实核心原因是Hapi的默认错误响应(像404这种)并不会自动继承你在服务器全局配置的CORS规则,得我们手动处理一下。给你几个可行的解决办法:

方案1:全局拦截错误响应添加CORS头(推荐)

利用Hapi的onPreResponse扩展点,在响应发送到客户端之前,拦截404这类默认错误,手动补上CORS头。代码示例:

server.ext('onPreResponse', (request, h) => {
    const response = request.response;
    // 判断是否是Boom类型的错误,且状态码为404
    if (response.isBoom && response.output.statusCode === 404) {
        // 添加上你需要的CORS头,和全局配置保持一致即可
        response.output.headers['Access-Control-Allow-Origin'] = '*';
        response.output.headers['Access-Control-Allow-Headers'] = 'Accept, Authorization, Content-Type';
        // 要是需要允许特定方法,也可以加上这个头
        response.output.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';
    }
    return h.continue;
});

这个方案的优势是不用改动现有路由和全局配置,只需要在全局层面做一次拦截处理,所有默认错误的CORS头都会被正确设置,灵活性最高。

方案2:调整全局路由的CORS配置

你当前全局路由用的是origin: ['ignore'],这个配置的作用是跳过CORS检查,但Hapi的默认错误响应不会识别这个规则。可以把它改成更明确的设置,让默认错误也能自动应用CORS:

const server = Hapi.server({ 
    host: env.HOSTNAME, 
    port: env.PORT, 
    routes : { 
        cors: { 
            origin: ['*'], // 直接允许所有源,替代ignore
            headers: ['Accept', 'Authorization', 'Content-Type'],
            additionalHeaders: ['*'] // 根据业务需求可选添加
        } 
    } 
});

注意:如果你的业务场景不允许所有源访问,那这个方案就不太适合,得换成具体的源数组,比如origin: ['https://your-frontend-domain.com']。

方案3:手动注册404兜底路由

自己定义一个匹配所有路径的路由,专门处理404请求,这样因为是正常路由,CORS配置会自动生效:

server.route({
    method: '*',
    path: '/{any*}',
    options: {
        cors: {
            origin: ['*'],
            headers: ['Accept', 'Authorization', 'Content-Type', '*']
        }
    },
    handler: (request, h) => {
        return h.response({ error: 'Resource not found' }).code(404);
    }
});

这个方案的好处是你可以完全自定义404的响应内容,同时确保CORS头正确,但需要注意这个路由要放在所有其他路由的后面,不然会覆盖正常路由的匹配。

内容的提问来源于stack exchange,提问作者BastienSander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:30:12