NPM 模块(节点/浏览器)中的 JSONP 跨域
Posted
技术标签:
【中文标题】NPM 模块(节点/浏览器)中的 JSONP 跨域【英文标题】:JSONP in NPM module (Node/Browser) Cross domain 【发布时间】:2016-06-26 12:36:52 【问题描述】:我正在编写一个 NPM 模块,它应该可以在 Node 和浏览器中运行(通过 Browserify 打包)。
它的部分功能是执行 JSONP 调用,并返回解析后的数据。
我无法让它工作。
我尝试使用 jsonp-client
和 jsonp
npm 模块,但收效甚微。
node-jsonp
:https://www.npmjs.com/package/node-jsonp
promise = new promise (resolve, reject) ->
nodejsonp url, (json) ->
resolve json
上面的 sn-p 在 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”
【问题讨论】:
【参考方案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 跨域的主要内容,如果未能解决你的问题,请参考以下文章