JSONP - express:为啥浏览器会忽略请求?

Posted

技术标签:

【中文标题】JSONP - express:为啥浏览器会忽略请求?【英文标题】:JSONP - express: Why does the browser ignore the request?JSONP - express:为什么浏览器会忽略请求? 【发布时间】:2017-06-25 02:42:22 【问题描述】:

我编写了以下 html 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>HTML page</title>
</head>

<body>
    <script src='http://localhost:3000?callback=mycallbackFunction'> </script>
    <script>
        function mycallbackFunction(data) 
            alert('here');
            alert (data['a']);
        
    </script>
</body>

</html>

如您所见,脚本标签包含对远程服务器的 JSONP 请求。

另外,我写了如下node.js文件并作为服务器运行:

var express = require('express'); var app = express();

app.get('/', function(req, res) 
   res.jsonp('a': 'blabla');
);

app.listen(3000);

在我运行 node.js 文件并使用 html 页面打开浏览器后,我预计会看到一个警报弹出窗口。但不是。我什么也没看到。

开发者工具中的网络选项卡显示请求已被接受:

你知道怎么解决吗?

【问题讨论】:

【参考方案1】:

您需要交换 &lt;script&gt; 元素的顺序。

解释:

Express 正确地提供了一个看起来像 myCallbackFunction('a': 'blabla') 的脚本,这正是您所希望的。但是,此脚本会立即运行,并且 myCallbackFunction 尚未定义,因此没有任何反应。然后,在下一个&lt;script&gt; 块中,您定义myCallbackFunction,但这没有用,因为(失败的)调用已经发生在前面的&lt;script&gt; 中。

此外,mycallbackFunction 中的 C 大小写不匹配 - 请确保回调参数和函数名称之间的大小写一致。

【讨论】:

你是对的。我更改了脚本标签的顺序并修复了“C”并且它有效!【参考方案2】:

解决方法是切换两个脚本标签的顺序:

<body>
    <script>
        function mycallbackFunction(data) 
            alert('here');
            alert (data['a']);
        
    </script>
    <script src='http://localhost:3000?callback=mycallbackFunction'>  </script>
</body>

【讨论】:

以上是关于JSONP - express:为啥浏览器会忽略请求?的主要内容,如果未能解决你的问题,请参考以下文章

当 JSONP 和 CORS 等变通方法存在时,为啥浏览器会有同源策略?

Express api res.jsonp 返回双重回调

为啥 Javascript 会忽略单行 HTML 注释?

为啥当我从express发送一个简单的文件时,客户端会消耗大量内存?

为啥浏览器会忽略 set-cookie 标头,并且未使用 fetch 从 Ajax 调用中保存 cookie?

为啥即使禁用缓存,服务器也会忽略代码文件中的更改?