NPM 模块中的 JSONP(节点/浏览器)跨域

JSONP in NPM module (Node/Browser) Cross domain

本文关键字:浏览器 跨域 节点 模块 JSONP NPM      更新时间:2023-09-26

我正在编写一个NPM模块,应该在Node和浏览器上工作(通过Browserify打包)。

其部分功能是执行 JSONP 调用,并返回解析的数据。我无法让它工作。我尝试使用 jsonp-clientjsonp npm 模块,但无济于事。

node-jsonp : https://www.npmjs.com/package/node-jsonp

promise = new promise (resolve, reject) ->
        nodejsonp url, (json) ->
            resolve json

上面的代码片段在 Node 中工作正常,但在浏览器中由于同源跨域安全策略而失败。

jsonp-client https://www.npmjs.com/package/jsonp-client

promise = new promise (resolve, reject) ->
        jsonpclient url, (err, data) ->
            if (err)
                console.log err
            resolve data

在这种情况下,我收到错误"错误:无法在URL(...)上找到回调",但我无法从文档中了解如何正确实现该功能。

帮不上什么忙?:)

编辑:提到的第一个包实际上是"node-jsonp"而不是"jsonp"

看起来您使用他们的 API 不正确。第一个包的 API 是:jsonp(url, opts, fn) ,所以你应该重写代码并添加选项:

promise = new promise (resolve, reject) ->
    jsonp url, {}, (json) ->
        resolve json

第二个在文档中有这个:

浏览器上,您必须在 URL 上提供有效的回调。

它需要手动将回调参数添加到 URL。您应该检查 jsonp 的工作原理:它添加了callback GET 参数和响应包装在此回调函数的调用中。即

  • 您收到的请求: <api url>?callback=cb ;
  • 服务器呈现JavaScript响应,该响应将在应用程序cb({json});eval
  • 为了处理此响应,您应该具有全局函数cb,它将接收 JSON 作为参数。