nodejs实现jsonp跨域方案

452 阅读1分钟

JSONP简述

JSONP是“JSON with padding”的简写,是在web服务上流行的一种JSON变体。
JSONP格式包含两个部分:回调和数据。如:callback({"name": "jsonp"})
JSONP调用是通过动态创建<script>元素并为src属性指定跨域URL实现的。

优点

简单易用。使用JSONP可以直接访问响应,实现浏览器与服务器的双向通信。

缺点

  • 不安全,JSONP是从不同的域拉取可执行代码。
  • 不好确定JSONP请求是否失败。

JSONP实现

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>jsonp study</title>
</head>
<body>
  
  <script>
    function printName(data) {
      document.write('hello ' + data.name);
    }
  </script>
  <!-- 因为JSONP是有效的JavaScript,所以JSONP响应在被加载完成只后会立即执行。 -->
  <script src="http://127.0.0.1:8000?callback=printName"></script>
</body>
</html>

动态创建script元素然后指定src属性也行。

node代码

const http = require('http');
const server = http.createServer();

server.listen(8000);

server.on('request', (req, res) => {
  try {
    // 注意:这里假设url只传递一个参数callback
    const callback = req.url.split('=')[1];

    res.statusCode = 200;

    // 返回JSONP格式数据
    res.end(`${callback}({"name": "JSONP"})`);
  } catch(ex) {
    console.error(ex.message);

    res.statusCode = 500;
    res.end('throw new Error("server error")');
  }
});

通过以上代码就简单实现了通过jsonp跨域请求数据。有兴趣的小伙伴可以自己试试哦~