【发布时间】:2021-12-10 00:26:19
【问题描述】:
基本问题:您已经按照教程进行操作,您已经启动了 Hapi 服务器,它正在运行……但它不起作用。通过 curl 直接调用会得到一些东西,使用 Web 浏览器直接加载 API 调用会得到一些东西......但是在应用程序中使用该 API 端点,比如 Angular 或 React,它会出现如下错误消息:
从源“http://localhost:5000”访问“https://localhost:3000/server/ping”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。
这是真的:您检查标题,并且 Access-Control-Allow-Origin 根本不在该列表中。因此,您的应用在预检请求中被阻止,甚至不会进行实际的 GET/POST 调用。
这是一个完整的 Hapi v20.2.0 服务器的完整文件,在 TypeScript 中:
'use strict'
import * as fs from 'fs'
import * as util from 'util'
import * as path from 'path'
import * as os from 'os'
import * as Hapi from '@hapi/hapi'
import * as Http2 from 'http2'
const strFullNameCert:string=path.resolve(
os.homedir(),
'ssl',
'domain.crt')
const strFullNameKey:string=path.resolve(
os.homedir(),
'ssl',
'domain.key')
const key :Buffer = fs.readFileSync(strFullNameKey)
const cert:Buffer = fs.readFileSync(strFullNameCert)
const sslDetails ={key,cert}
const server = new Hapi.server({
listener: Http2.createSecureServer(sslDetails), // optional: remove this line for http1.1
host: 'localhost',
port: 3000,
tls: sslDetails,
routes: {
cors: true
},
})
console.log(`Host : ${server.info.host}`)
console.log(`Port : ${server.info.port}`)
console.log(`Method : ${server.info.protocol}`)
console.log(`Hapi : v${server.version}`)
server.route({
method: 'GET',
path:'/server/ping',
handler: async (request, reply) => {
console.log(`>>>ROUTE>>> : ${request.route.path}`);
const response = reply.response({ qSuccess: true, qResult: 'pong' })
return response;
}
})
server.start()
重申一下,此代码将“工作”,如果您以独立方式加载 /server/ping 路由,它将提供响应。如果您正在构建一个 Web 服务器来提供页面,那么这可能就足够了。
此代码在网络应用程序中仍然无法通过 CORS 验证。为什么?因为甚至永远不会发出对 /server/ping 的请求。该应用程序将首先发送预检 OPTIONS 请求。这段代码中没有任何东西可以处理它。所以 nothing 你在 server.route 区域做的,弄乱路由选项,或添加标题,将解决这个问题。在路由的主服务器实例化中有十亿个不同的设置:cors 不会解决这个问题,因为它们也没有解决实际问题。
【问题讨论】: