处理 Hapi 中的 CORS 问题

在开发前端应用时,常常需要从不同的域名获取数据或调用 API。而在这种情况下,跨源资源共享(CORS)就成为非常重要的技术。Hapi 是一款 Node.js 的 Web 框架,但是默认情况下并不支持 CORS。本文将介绍如何在 Hapi 中实现 CORS,以便能够跨域访问 API 并获取所需数据。

什么是 CORS?

CORS 是一项允许服务器向其他域名的浏览器提供访问权限的标准。由于 Same-Origin Policy(SOP)的存在,浏览器只允许页面向其自身站点的 URL 发送 AJAX 请求。因此,对于跨域请求,浏览器会发出同源检查错误并阻止请求的发送。CORS 用于解决这个问题,其基本思想是允许服务器在响应的头文件中声明允许哪些来源访问数据。

在 Hapi 中启用 CORS

在 Hapi 中启用 CORS 非常简单,只需使用 hapi-cors 插件即可。hapi-cors 是一个非常流行的插件,它提供了与 CORS 相关的所有功能。下面是如何在 Hapi 中使用该插件的示例代码:

const Hapi = require('hapi');
const corsHeaders = require('hapi-cors-headers');
const HapiCors = require('hapi-cors');

const server = Hapi.server({
    port: 3000,
    host: 'localhost'
});

async function startServer() {
    await server.register({
        plugin: HapiCors,
        options: {
            origins: ['*'],
            allowCredentials: true,
            exposeHeaders: ['content-type', 'content-length'],
            maxAge: 600,
            methods: ['POST, GET, PUT, DELETE, OPTIONS'],
            headers: ['Accept', 'Authorization', 'Content-Type', 'If-None-Match', 'Accept-language']
        }
    });

    server.ext('onPreResponse', corsHeaders);

    server.route({
        method: 'GET',
        path: '/api/v1/hello',
        handler: (request, reply) => {
            return { message: 'Hello, World!' };
        }
    });

    await server.start();
    console.log(`Server running at ${server.info.uri}`);
}

startServer().catch(err => {
    console.error(err);
    process.exit(1);
})

在上面的示例代码中,我们首先使用 Hapi.server 方法创建了一个 Hapi 服务器。然后在我们的 startServer 方法中,我们通过 server.register 方法注册了 hapi-cors 插件。在 options 配置对象中,我们声明了允许的请求源,以及允许发送 cookie 和开放的 CORS 头。最后,我们使用 server.ext 方法来注册一个 onPreResponse 扩展,该扩展添加了正确的 CORS 头到所有响应中。

最后,我们定义了一个简单的路由,并使用 server.start 方法将应用程序绑定到指定的端口上。

总结

CORS 让我们可以在跨域请求时正常使用 AJAX。但是在 Hapi 中实现 CORS 需要我们进行一些额外的设置。本文介绍了如何使用 hapi-cors 插件来启用 CORS,该插件提供了与 CORS 相关的完整功能。如果您正在使用 Hapi 开发 API 或 Web 应用程序,那么本文中的技术将是非常有用的。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65add202add4f0e0ff74ab7f