jsonp的nodejs实战

我打开了2个web服务,127.0.0.1:3000,127.0.0.1:2999

jsonp首先要求后台提供一个可以返回 fnName(result) 字符串的接口;
然后前端首先定义好fnName(result)的方法,然后使用script的src属性访问此接口。
可以动态和删除script标签,就可以请求跨域的接口了,缺点是要后台提供特定的接口

  1. var http = require("http");
  2. var querystring = require('querystring');
  3. var url = require('url');
  4. var serverHTML = http.createServer((req, res) => {
  5. var indexHtml =
  6. '<html>\n'
  7. + '<meta charset="utf-8">\n'
  8. + '<head>\n'
  9. + '<title>跨域请求</title>\n'
  10. + '<script>\n'
  11. + 'function abc(result){\n'
  12. + 'var data = JSON.stringify(result);\n'
  13. + 'document.getElementById("text").innerHTML = data;\n'
  14. + '}\n'
  15. + 'window.onload = function () {\n'
  16. + 'document.getElementById("btn").onclick = function () {\n'
  17. + 'var script = document.createElement("script");\n'
  18. + 'script.src = "http://127.0.0.1:3000?callback=abc";\n'
  19. + 'document.getElementsByTagName("head")[0].appendChild(script);\n'
  20. + 'var script2 = document.createElement("script");\n'
  21. + 'script2.src = "//common.cnblogs.com/scripts/jquery-2.2.0.min.js"\n'
  22. + 'document.getElementsByTagName("head")[0].appendChild(script2);\n'
  23. + '}\n'
  24. + '}\n'
  25. + '</script>\n'
  26. + '</head>\n'
  27. + '<body>\n'
  28. + '<input id="btn" type="button" value="跨域获取数据" />\n'
  29. + '<div id="text"></div>\n'
  30. + '</body>\n'
  31. + '</html>\n'
  32. res.writeHead(200, { 'Content-Type': 'text/html' });
  33. res.write(indexHtml);
  34. res.end();
  35. }).listen(2999);
  36. var server = http.createServer((req, res) => {
  37. /*
  38. const headers = JSON.stringify(req.headers);
  39. const cookie = req.headers.cookie;
  40. res.write('headers:' + headers);
  41. res.write('\n');
  42. res.write('\n');
  43. res.write('cookie:' + cookie);
  44. res.write('\n');
  45. res.write('\n');
  46. res.write('method:' + JSON.stringify(req.method));
  47. res.write('\n');
  48. res.write('\n');
  49. res.write('url:' + req.url);
  50. */
  51. if (req.method === 'GET') {
  52. console.log('GET');
  53. var params = url.parse(req.url, true).query;
  54. var callback = params.callback + '(' + '"aaa"' + ')';
  55. res.write(callback);
  56. console.log(params);
  57. res.end();
  58. } else if (req.method === 'POST') {
  59. // 未完待续接收post请求
  60. console.log('post');
  61. var body = "";
  62. req.on('data', function (chunk) {
  63. body += chunk; //一定要使用+=,如果body=chunk,因为请求favicon.ico,body会等于{}
  64. console.log("chunk:", chunk);
  65. });
  66. req.on('end', function () {
  67. // 解析参数
  68. body = querystring.parse(body); //将一个字符串反序列化为一个对象
  69. console.log("body:", body);
  70. // 设置响应头部信息及编码\<br><br> res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
  71. if (body.name && body.url) { // 输出提交的数据
  72. res.write("网站名:" + body.name);
  73. res.write("<br>");
  74. res.write("网站 URL:" + body.url);
  75. } else { // 输出表单
  76. res.write();
  77. }
  78. res.end();
  79. });
  80. }
  81. }).listen(3000);

笔试题四

实现一个jsonp函数,仅需要支持jsonp(url)一种调用方式即可(仅有url一个传参),例如: jsonp(‘//t.alicdn.com/t/gettime?callback=cb’).then(result=>console.dir(result))

未完待续