鍍金池/ 問(wèn)答/HTML/ 使用jsonp解決跨域問(wèn)題,通過(guò)Node開(kāi)啟一個(gè)服務(wù),訪問(wèn)一次為什么服務(wù)器打印出

使用jsonp解決跨域問(wèn)題,通過(guò)Node開(kāi)啟一個(gè)服務(wù),訪問(wèn)一次為什么服務(wù)器打印出來(lái)兩次?

跨域的解決方案之一:jsonp

// server.js
var qs = require('queryString');
var http = require('http');
var server = http.createServer();

server.on('request', function(req, res) {
  console.log('irene'); // 打印irene

  var params = qs.parse(req.url.split('?')[1]);
  var fn = params.callback;

  // jsonp返回設(shè)置
  res.writeHead(200, { 'Content-Type': 'text/javascript' });
  res.write(fn + '(' + JSON.stringify(params) + ')');

  res.end();
})
server.listen('8094');
console.log('Server is running at port 8094...');

// jsonp.html
<html>
  <head></head>
  <body>
    <script>
      var script = document.createElement('script');
      script.type = 'text/javascript';
  
      // 傳參并指定回調(diào)執(zhí)行函數(shù)為onBack
      script.src = 'http://www.domain2.com:8094/login?user=admin&callback=onBack';
      document.head.appendChild(script);
  
      // 回調(diào)執(zhí)行函數(shù)
      function onBack(res) {
          alert(JSON.stringify(res));
      }
   </script>
  </body>
 </html>
 

當(dāng)我在瀏覽器中訪問(wèn)jsonp.html,為什么server.js中的'irene'會(huì)打印兩次?

回答
編輯回答
北城荒

favicon.ico 。。。那你用的根本不是跨域環(huán)境啊,只是嘗試了下 jsonp 而已。
favicon.ico 是個(gè)網(wǎng)站都會(huì)去請(qǐng)求一下,自動(dòng)發(fā)起的,把你的 jsonp 邏輯加到按鈕點(diǎn)擊事件里再去觸發(fā)就能看到只有一次了。

2017年9月1日 06:23
編輯回答
陌上花

是因?yàn)檎?qǐng)求了兩次,一次localhost:8094,一次localhost:8094/favicon.ico,打印res.url就看的很清楚了

2018年3月14日 00:39