【问题标题】:POST request not returning Allow-Origin headerPOST 请求未返回 Allow-Origin 标头
【发布时间】:2018-09-22 00:59:10
【问题描述】:

我正在尝试在启用了 cors 的 AWS lambda 上发出 POST 请求,并且我在 API 中使用了 cors 包。 然后我使用 fetch 发出 POST 请求,但出现此错误:

请求的资源上不存在“Access-Control-Allow-Origin”标头。

cors 包不应该对此进行处理,或者我需要做一些额外的配置?

api.js

import { json, urlencoded } from 'body-parser'
import express from 'express'
import cors from 'cors'

import recipe from './routes/recipe'
import login from './routes/login'
import unit from './routes/unit'

const app = express()

app.use(cors()) // enabling cors
app.use(json())
app.use(urlencoded({ extended: true }))

app.use('/recipes', recipe)
app.use('/login', login)
app.use('/units', unit)

request.js

const params = { 'POST', body, mode: 'cors' }
return await (await fetch(baseURL + endpoint, params)).json()

recipe.js

import { Router } from 'express'
const router = Router()

router.post('/', async ({ body }, res) => {
  // save recipe in database
  res.json(recipeId)
})

export default router

完整源代码 - api:https://github.com/EliasBrothers/zanzas-recipes-api/tree/beta-develop 前端 - https://github.com/EliasBrothers/zanzas-recipes-web/tree/develop

【问题讨论】:

  • 您的 cors 配置似乎没问题。我想知道 request.js 在哪里运行?客户端还是 AWS lambda?
  • 在 lambda 上运行,我使用 claudiajs 在 aws 上部署
  • api.js是同一个项目吗?如果是这样,问题是应该在服务器端重新配置 CORS 设置,这意味着 baseURL 运行的位置。
  • api.js 在 lambda 上运行,请求在本地运行。在 aws 控制台中,我在这个 api 中启用了 cors
  • ApiGateway 是否启用了 Cors?我的意思是在您的资源中是否添加了 OPTIONS 方法作为模拟请求?

标签: node.js express cors aws-lambda fetch-api


【解决方案1】:

我通过更新项目中的包并更改请求使其工作

 const stringifiedBody = JSON.stringify(body) // added
  const params = {
    method,
    body: stringifiedBody,
    mode: 'cors',
    headers: { // added
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    }
  }

【讨论】:

    【解决方案2】:

    我不确定这是否是复制错误,您没有以正确的方式指定获取方法 POST。有时,Not Found 页面也会被识别为 CORS 问题。您是否尝试过规范化您的 fetch 参数?

    params = {
     method: 'POST',
     body: body,
     mode:'cors'
    }
    

    【讨论】:

    • 太糟糕了,你在本地开发环境中测试过cors设置吗?有用吗?
    • 是的,我有另一个端点,我发出 GET 请求,响应的标题为“Allow-Origin”
    • CORS 中间件的document 中,cors 配置也可以位于每条路径,如配方、登录或单元。有没有检查是否有设置被覆盖?
    • Theo 文档说 app.use(cors) 足以使所有路由都启用 cors。我也尝试在食谱中使用 router.use(cors),但没有用。
    猜你喜欢
    • 2016-10-12
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2015-12-24
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多