Express.js 如何优雅地处理 JSONP 请求

Express.js 如何优雅地处理 JSONP 请求

在前端开发中,跨域请求是常见的需求。而JSONP(JSON with Padding)是实现跨域请求的一种常见方式。在使用 Express.js 建立 web 应用时,通过响应 JSONP 请求返回数据,是前端开发中经常使用的技巧,称之为 JSONP API,即提供 JSONP 接口。

JSONP 本质上是利用 <script> 标签可以跨域加载资源的特性,将 JSON 数据作为一段回调函数的参数,通过动态创建 <script> 标签,向指定的服务端 URL 发送 GET 请求,返回一个回调函数的调用,从而实现跨域数据的传输。这种方式虽然实现了跨域请求,但也有明显的缺点,如只能发送 GET 请求、对数据大小有限制等等。

因此,在 Express.js 上如何优雅地处理 JSONP 请求呢?下面就为大家介绍一下。

创建 JSONP API

在 Express.js 中,创建 JSONP API 非常容易,只需要通过 res.jsonp() 方法,将数据返回给客户端即可。

示例代码如下所示:

app.get('/api/jsonp', (req, res) => {
  const data = { name: '张三', age: 20 };
  res.jsonp(data);
});

在这段代码中,我们使用 app.get() 方法监听了客户端的 GET 请求,当 URL 匹配为 '/api/jsonp' 时,就会触发回调函数:(req, res) => { }。

通过 res.jsonp() 方法将数据返回到客户端。在返回 json 数据的同时,通过回调函数名将数据传递给客户端。例如,如果客户端发起的请求 URL 是:http://localhost:3000/api/jsonp?callback=foo,那么服务端返回的数据格式将会是: foo({"name":"张三","age":20})。

实现 JSONP API 中间件

为了使 JSONP API 更加易用和灵活,我们可以将返回 JSONP 结果封装成一个中间件,以便其它路由可以方便地使用该中间件返回 JSONP 格式的数据。

示例代码如下所示:

const jsonpMiddleware = (req, res, next) => {
  res.jsonp = (data) => {
    const callbackName = req.query.callback;
    if (callbackName) {
      const result = `${callbackName}(${JSON.stringify(data)})`;
      res.type('text/javascript');
      res.send(result);
    } else {
      res.json(data);
    }
  };
  next();
};

app.use(jsonpMiddleware);
app.get('/api/jsonp', (req, res) => {
  const data = { name: '张三', age: 20 };
  res.jsonp(data);
});

在这段代码中,我们定义了一个 jsonpMiddleware 中间件,该中间件会在每个请求到达之前进行拦截。在该中间件中,我们定义了一个 res.jsonp 方法,这个方法中判断了请求 URL 上是否有回调函数名称。如果有,则返回 JSONP 格式的数据。

最后,我们使用 app.use() 方法将中间件注册到应用中。

总结

通过这篇文章的学习,我们了解了 JSONP 的原理,并且明白了如何使用 Express.js 创建 JSONP API 。在实际项目中,创建 JSONP API 是非常常见的需求,而实现 JSONP API 中间件,则是让代码更加优雅和易懂的好习惯。

希望本篇文章对您有所帮助,让您的前端开发工作更加顺畅。

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


纠错反馈