electron 中 http 和node不一样,总是获取不完整

发布于 2022-09-12 04:22:34 字数 633 浏览 13 评论 0

这个是node中的代码
`

const https = require("https");

const url = "https://www.baidu.com/";
var req = https.request(url, function (response) {
    var chunks = [];
    response.on("data", function (chunk) {
        console.log("===================================");
        chunks.push(chunk);
    });
    response.on("end", function () {
        var buffer = Buffer.concat(chunks);
        console.log(buffer.toString());
    });
});

req.on("error", function (e) {
    console.log(e.message);
});
req.end();

`

这个可以获取完整的html, 但是吧这个代码贴进 electron 就中不行了, 获取的html不完整并且还乱码。
请问是怎么回事?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

离旧人 2022-09-19 04:22:34

写完才发现是个挖坟贴....

这种情况你应该拿出一个能复现你的问题的“最简”代码放在github或什么地方能让人查看,否则鬼知道你遇到的是什么问题?

直觉上我并不觉得electron这种迭代很久的产品会有这样明显的功能性问题,今天无事索性用个demo验证一下

main.js

const { app, BrowserWindow } = require("electron");
const path = require("path");
process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true";
app.whenReady().then(() => {
  const window = new BrowserWindow({
    webPreferences: {
      nodeIntegration: true,
    },
  });
  window.loadFile(path.join(__dirname, "index.html"));
});
app.on("window-all-closed", () => {
  if (process.platform !== "darwin") {
    app.quit();
  }
});

package.json

{
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "dependencies": {
    "electron": "^10.0.0"
  }
}

index.html

<bdoy></bdoy>
<script src="./app.js"></script>

app.js

const https = require("https");
function request(url, time) {
  return new Promise((resolve, reject) => {
    const req = https.request(url, (res) => {
      const chunks = [];
      res.on("data", function (chunk) {
        chunks.push(chunk);
      });
      res.on("end", function () {
        const html = Buffer.concat(chunks).toString();
        console.log("  " + html.substring(html.length - 9));
        console.log(`====end:  ${time}====`);
        resolve();
      });
    });
    req.end();
    console.log(`====start:${time}====`);
  });
}

(async function () {
  for (let i = 0; i < 5; i++) {
    await request("https://www.baidu.com/", i + 1);
  }
})();

第一次输出没有任何问题

====start:1====
app.js:11   </html>

app.js:12 ====end:  1====
app.js:17 ====start:2====
app.js:11   </html>

app.js:12 ====end:  2====
app.js:17 ====start:3====
app.js:11   </html>

app.js:12 ====end:  3====
app.js:17 ====start:4====
app.js:11   </html>

app.js:12 ====end:  4====
app.js:17 ====start:5====
app.js:11   </html>

app.js:12 ====end:  5====

考虑到用脚手架开发都会动态刷新,可能是刷新的问题? 我F5了之后确实有问题,现在输出只有:

====start:1====

看起来是事件没有触发,用关键词electron node async io not working on reload搜索,第一条就是:https://github.com/electron/electron/issues/22119,看https://github.com/electron/electron/issues/18397里面的时间线一时半会还没法确定。

不过简单的把主进程添加`app.allowRendererProcessReuse = false可以解决上面的问题,只不过楼主遇到的问题是不是这个就不知道了。

ヤ经典坏疍 2022-09-19 04:22:34

我也遇到这个问题,是因为在electron里end事件有时触发有时候不触发,我的办法是把end里面的方法写到data事件里的setTimeout,每执行一次data就重置一次setTimeout,当data超过一段时间不执行后,就说明请求完成了,就会执行setTimeout里面的方法。
总之就是你自己写个定时器去检查请求是否已经结束

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文