解决 Express.js 后台开发中遇到的跨域问题

在开发过程中,经常会遇到前后端分离的情况,这时候就需要前后端进行数据交互,而跨域问题是一个经常出现的问题。本文将介绍如何在 Express.js 后台开发过程中解决跨域问题。

什么是跨域?为什么会出现跨域问题?

跨域指的是浏览器不能执行其他网站的脚本。出于安全考虑,浏览器会限制脚本的跨域操作。例如,http://localhost:3000 的网页通过 AJAX 请求 http://www.example.com/data.json 的数据,就是跨域操作。

为什么会出现跨域问题?是因为浏览器的同源策略。同源是指协议、域名、端口号均相同。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。

解决跨域问题的方法

  1. JSONP

JSONP 是一种跨域解决方案之一。它通过 <script> 标签加载一个 JavaScript 文件,该文件载入成功后会执行回调函数,并且会把需要的 JSON 数据作为参数传入回调函数。

示例代码:

app.get('/data.jsonp', (req, res) => {
  const data = {
    name: 'Tom',
    age: 18
  }
  const callback = req.query.callback
  res.send(`${callback}(${JSON.stringify(data)})`)
})

请求:

const script = document.createElement('script')
script.type = 'text/javascript'
script.src = 'http://localhost:3000/data.jsonp?callback=foo'
document.body.appendChild(script)

function foo(data) {
  console.log(data) // output:{name: "Tom", age: 18}
}
  1. CORS

CORS 是跨源资源共享(Cross-Origin Resource Sharing)的缩写。它在服务器端允许 Web 应用程序访问跨源资源的一种机制。相比 JSONP,CORS 更加灵活,能够支持更多的请求类型,例如 PUT 和 DELETE。

示例代码:

const cors = require('cors')

app.use(cors({
  origin: 'http://localhost:8080', // 允许源访问API
  methods: ['GET', 'PUT', 'POST', 'DELETE'], // 允许的http请求方式
  allowedHeaders: ['Content-Type', 'Authorization'] // 允许的http请求头
}))

总结

跨域问题在前后端开发中是一个常见的问题。本文介绍了两种解决跨域问题的方法:JSONP 和 CORS。JSONP 简单易用,但只支持 GET 请求。CORS 更加灵活,支持多种请求类型和请求头。根据实际情况选择合适的方式来解决跨域问题。

参考链接

跨域资源共享 CORS 详解

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