我将尝试使用 Firebase HTTP 函数与 Nest 框架进行集成,但是在客户端调用时遇到了 CORS 错误。
以下是我的设置:
以下是我的设置:
declare const require: any
const functions = require('firebase-functions')
const cors = require('cors')({ origin: true })
const express = require('express')
const app = express()
app.use(cors)
const cb = (req, res) => res.status(200).send('success')
app.use(cb)
export default functions.https.onRequest(app)
以上内容完全正常(使用设置为allAuthenticatedUsers
的Cloud Functions Invoker角色)。
这是我在Nest中的新设置:
import * as functions from 'firebase-functions'
import { NestFactory } from '@nestjs/core'
import { ExpressAdapter } from '@nestjs/platform-express'
import { Api_Module } from './api.module'
import express from 'express'
const server = express()
const create_nest_server = async (express_instance: express.Express) => {
const adaptor = new ExpressAdapter(express_instance)
const app = await NestFactory.create(Api_Module, adaptor)
app.enableCors({ origin: true })
await app.init()
return app
}
create_nest_server(server)
.then(v => console.log('Nest Ready'))
.catch(err => console.error('Nest broken', err))
export default functions.https.onRequest(server)
(来自 https://fireship.io/snippets/setup-nestjs-on-cloud-functions/)
这将在客户端会产生以下错误:访问'https://us-central1-<project>.cloudfunctions.net/api-default/'被跨域策略阻止,来源'http://localhost:4200',请求资源没有'Access-Control-Allow-Origin'头。如果一个不透明的响应能够满足您的需求,请将请求的模式设置为“no-cors”以禁用CORS而获取资源。
我也尝试了一些其他的方法,例如:
declare const require: any
const cors = require('cors')({ origin: true })
const server = express()
server.use(cors)
// ...the rest
并且:
const create_nest_server = async (express_instance: express.Express) => {
const adaptor = new ExpressAdapter(express_instance)
const app = await NestFactory.create(Api_Module, adaptor, {
cors: {
origin: true,
}
})
app.enableCors()
await app.init()
return app
}
和:
const nestApp = await NestFactory.create(AppModule, adapter, {
logger: new CoreLogger(),
cors: {
origin: '*',
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS',
credentials: true,
preflightContinue: false,
optionsSuccessStatus: 204,
},
})
除了不带任何参数使用app.enableCors()
之外。
非常感谢您的帮助。
app.enableCors()
,就像链接中所看到的那样,但遗憾的是没有成功。 - skwny