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

Posted

技术标签:

【中文标题】NPM 模块(节点/浏览器)中的 JSONP 跨域【英文标题】:JSONP in NPM module (Node/Browser) Cross domain 【发布时间】:2016-06-26 12:36:52 【问题描述】:

我正在编写一个 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

上面的 sn-p 在 Node 中运行良好,但在浏览器中由于同源跨域安全策略而失败。

jsonp-clienthttps://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”

【问题讨论】:

【参考方案1】:

看起来您使用的 API 不正确。 first one包的API是:jsonp(url, opts, fn),所以你应该重写你的代码并添加opts:

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

Second one 在文档中有这个:

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

URL 需要manual adding of callback 参数。您应该检查how jsonp works:它在调用此回调函数时添加了callback GET 参数和响应。 IE。

您正在发送请求:<api url>?callback=cb; 服务器呈现 javascript 响应,这将是 eval-ed 在您的应用程序 cb(json); 要处理此响应,您应该有 global 函数 cb,它将接收 json 作为参数。

【讨论】:

嗨,Alexandr,感谢您对此进行调查。关于你的第一个建议,我的错,这个包实际上是“node-jsonp”,根据他们的文档,它也接受这种语法。不过,跨域问题,没有运气。关于您的第二个建议,这是定义 NPM 包使用的全局回调的好方法吗?我希望会有一种侵入性较小的方法:)

以上是关于NPM 模块(节点/浏览器)中的 JSONP 跨域的主要内容,如果未能解决你的问题,请参考以下文章

原生js实现简单JSONP

JSONP跨域和CORS跨域的区别

jsonp

JavaScript 中的跨域请求与 jQuery 的 JSONP

解决Ajax 跨域问题 - JSONP原理解析

ajax基础4--什么是跨域以及如何解决跨域