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

本地端口下Admin-on-rest与Hapi.js 17.2.3 API跨域请求异常

解决Hapi.js与Admin-on-rest跨域请求头错误

你遇到的是典型的跨域资源共享(CORS)问题——你的Hapi API运行在3000端口,Admin-on-rest前端在3001端口,属于不同的源,浏览器的同源策略会拦截这类跨域请求。尤其是当请求包含Content-Type这类非标准头时,会触发OPTIONS预检请求,如果服务器没有正确配置CORS规则,就会出现你看到的错误。

针对Hapi.js 17.2.3版本,有两种配置方式可以解决这个问题:

1. 全局服务器级CORS配置

在创建Hapi服务器时,直接在路由配置里添加CORS规则,所有接口都会生效:

const Hapi = require('hapi');

const server = Hapi.server({
    port: 3000,
    host: 'localhost',
    routes: {
        cors: {
            origin: ['http://localhost:3001'], // 明确允许你的前端域名
            headers: ['Accept', 'Content-Type', 'Authorization'], // 允许前端发送的请求头,包含Admin-on-rest需要的Content-Type
            exposedHeaders: ['Content-Range', 'X-Content-Range'] // 可选:如果API返回分页相关响应头,需要暴露给前端
        }
    }
});

2. 单个路由级CORS配置

如果不想全局开启CORS,也可以针对/api/users单独路由配置:

server.route({
    method: 'GET',
    path: '/api/users',
    handler: (request, h) => {
        // 这里写你的用户列表处理逻辑
        return yourUserData;
    },
    options: {
        cors: {
            origin: ['http://localhost:3001'],
            headers: ['Accept', 'Content-Type', 'Authorization'],
            exposedHeaders: ['Content-Range']
        }
    }
});

配置完成后重启Hapi服务器,回到Admin-on-rest面板刷新页面,应该就能正常加载用户列表了。

核心原因是:Admin-on-rest发送的请求包含Content-Type头,属于非简单请求,浏览器会先发送OPTIONS请求询问服务器是否允许。上面的配置告诉服务器接受来自3001端口的请求,并且允许指定的请求头通过,这样预检请求就能通过,实际的GET请求也能正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:12:53