【问题标题】:Allowing CORS in NodeJS在 NodeJS 中允许 CORS
【发布时间】:2020-01-20 12:31:43
【问题描述】:

我定义了我的 Express js 应用:

const express = require('express')
var history = require('connect-history-api-fallback');
const path = require('path')
const http = require('http')
const socketio = require('socket.io')

require('./db/mongoose')
const userRouter = require('./routers/user')

const publicDirPath = path.join(__dirname, '../public')
const app = express()

app.use(express.static(publicDirPath))
app.use(history({
  index: '../public/index.html'
}))
app.use(express.static(publicDirPath))
app.use(express.json())
app.use(userRouter)

const server = http.createServer(app)
const io = socketio(server)

io.on('connection', socket => {
  console.log('New WebSocket connection')

  socket.on('join', () => {
    socket.emit('message', 'Welcome to the app')
  })
})

module.exports = server

然后我将它用于我的 index.js 文件:

const app = require('./app')

const port = process.env.PORT

app.listen(port, () => {
  console.log(`Server is up on port ${port}`)
})

当我运行应用程序并从同一个端口发送请求时 - 一切正常。但是当我尝试从不同的本地主机端口发送请求时,即。 8080,我收到跨源错误。 我尝试安装 cors 包并按如下方式使用它:

const cors = require('cors')

app.options('*', cors())
app.use(cors());

得到了同样的结果。

我尝试将配置传递给 cors:

app.use(cors({
  origin: 'http://localhost:8080'
}));

仍然得到相同的结果。

我做错了什么,我该如何让它发挥作用?

【问题讨论】:

  • 看看expressjs.com/en/resources/middleware/cors.html,它展示了如何使用cors()(与您尝试过的不同)。
  • "但是当我尝试从不同的 localhost 端口发送请求时" -> 你到底是什么意思?您能否确认您没有尝试访问非侦听端口?看起来你的应用只监听process.env.PORT,显然没有其他端口可以工作。
  • @Mike'Pomax'Kamermans 是的,我看到了。我认为它基本上是一样的,但是我必须将我的 Express 应用程序传递给 http.createServer 因为 socket.io
  • @fingeron 当我从 localhost:8080(Vue 应用程序)向快递服务器发送 axios 请求时,我收到此错误:Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:5555/users/login. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). localhost:5555 是我的快递服务器运行的地方。

标签: node.js express cors


【解决方案1】:

当您的前端应用尝试向 express 服务器发出请求时,

快速服务器正在阻止该请求,因为快速服务器不知道请求的来源(即前端服务器)

作为您尝试将其移出快速服务器域的请求。这就是你必须告诉服务器请接受来自这个来源的请求的原因,也就是 IP 地址

你可以通过cors实现

【讨论】:

    【解决方案2】:

    让我们花点时间用简单的话解释一下“起源”是什么。

    当用户浏览一个网站时,他会使用一个地址。 通常该地址是一个域,但当我们运行测试时,我们主要使用本地 IP。

    对于 CORS,这无关紧要。启用 Allow-Origins 后,服务器会查看用户用于访问网站的地址,并将其定义为请求的“来源”。

    显然,在更深层次上,一切都归结为 IP 地址。但是对于 CORS,它更像是一种高级别的安全方法。例如,它有助于防止跨站点请求伪造。

    总之,为了让 CORS 工作, 确保您允许用户使用的地址访问 HTTP 服务

    因此,如果您正在为在 http://localhost:8080 上运行的 VUE 应用程序提供服务,并从中调用 http://localhost:5555 上的 HTTP 服务,您需要在上述 HTTP 服务上执行此操作:

    app.use(cors({
      origin: 'http://localhost:8080'
    }));
    

    【讨论】:

    • 好吧,5555 端口不起作用(因为我从 8080 请求),但由于某种原因,这次用 localhost:8080 定义来源确实起作用了。而且我不明白为什么它第一次不起作用(如您所见,我在问题中指出我确实尝试过)。
    • @Igal 可能有很多事情,从在运行之前不保存文件到意外放置错误的环境值。很高兴你让它工作!我会更新我的答案以更具体。
    • 添加 Cors 后,可能是服务器重启造成的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2018-08-17
    • 2017-07-28
    • 1970-01-01
    • 2021-12-31
    • 2015-06-02
    • 2014-11-09
    • 2018-03-02
    相关资源
    最近更新 更多