【问题标题】:What is the url where an express app is located at inside an electron app快速应用程序位于电子应用程序内的 url 是什么
【发布时间】:2023-04-06 22:29:02
【问题描述】:

我不确定我这样做是否正确。我的最终目标是从 lambda 函数向我的电子应用程序发送一个发布请求并创建一个系统通知。在本地我已经能够从邮递员那里做到这一点,但是当我安装应用程序(在 linux 上)它不起作用,现在我不确定我应该将我的请求指向哪里,在开发中我也指出了它。 http://localhost:3000/notify 安装应用程序时会发生什么。我将如何向应用程序发送发布请求,最终我想建立用户帐户,所以我需要根据 lambda 逻辑向每个单独的用户发送请求。

我正在使用电子快递,有没有另一种方式来处理帖子请求。

这是我的 main.js 文件中的代码

"use strict";
const { app, BrowserWindow } = require("electron");
const { Notification } = require("electron");
const express = require("express");
const bodyParser = require("body-parser");

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
    },
  });

  win.loadFile("index.html");
  win.webContents.openDevTools();
}

app.whenReady().then(createWindow);

app.on("window-all-closed", () => {
  if (process.platform !== "darwin") {
    app.quit();
  }
});

app.on("activate", () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});

// Create a new instance of express
const appE = express();

// Tell express to use the body-parser middleware and to not parse extended bodies
appE.use(bodyParser.json());

// Route that receives a POST request to /sms
appE.post("/notify", function (req, res) {
  const body = req.body;
  console.log(body);
  res.set("Content-Type", "text/plain");

  function showNotification() {
    const notification = {
      title: "Basic Notification",
      body: `You sent: ${body.message} to Express`,
    };
    new Notification(notification).show();
  }

  app.whenReady().then(createWindow).then(showNotification);
  res.send(`You sent: ${body.message} to Express`);
});

// Tell our app to listen on port 3000
appE.listen(3000, function (err) {
  if (err) {
    throw err;
  }

  console.log("Server started on port 3000");
});

【问题讨论】:

  • 所以你的网络服务器在本地,但是一旦你将它部署到服务器上它就不再工作了?你是如何发布到你的服务器的?您能否提供您在本地环境和服务器环境中所做的工作的分步过程?
  • 我不确定我是否理解,我没有部署应用程序,它是一个电子应用程序,所以它安装在操作系统上。我只是向邮递员发送一个帖子请求,其中包含一条消息到 localhost:3000。我想知道的是如何实现 aws lambda 函数和内置电子应用程序之间的通信,因为它安装在计算机上并且没有 URL,我也可以发送帖子请求。

标签: javascript node.js express electron


【解决方案1】:

你的方法是错误的。在您的 Electron 应用程序中运行的 HTTP 服务器通常无法被运行在用户本地网络之外的任何东西访问,因此您的 Lambda 函数将无法连接到它。

如果您想从 Lambda 函数读取通知,则需要轮询它(在计时器上发出 Ajax 请求)。

如果你想将消息从服​​务器推送到应用程序,那么你仍然需要从客户端发起连接(以便可以在用户本地网络之外建立连接)。典型的方法是使用 Websockets。这些对 Lambda 函数不友好,因为它们需要始终开启,因此您需要在其他系统(如 EC2)上托管一个监听 Websocket 连接的服务器。如果您的基础设施已经为 Lambda 函数做好了准备,那么您可以编写一个在触发时向您的 EC2 服务器发送消息以触发 Websocket 消息的函数。

+-------+              +-------+                +-------+
|       |   HTTP       |       |                |       |
|   λ   |   Request    |HTTP   |   Websocket    |Client |
|       ----------------Server ------------------       |
+-------+              +-------+                +-------+

【讨论】:

  • 为了清楚起见,但我想你已经在这里回答了我的问题,我可以编写一个 lambda,将请求发送到 EC2(不是书面的 ES2)服务器,该服务器正在积极监听来自一个电子应用程序。如果是这样,我会花时间去那个兔子堡并选择你的答案。感谢您迄今为止的帮助。是使用 ajax 轮询 lambda 函数还是使用 websockets ec2 和 lambda?
  • 是的。两者都有自己的优势。轮询要简单得多,这意味着您不需要添加连续服务器。拥有服务器将有更快的反应时间,并且在资源方面可能更便宜,尤其是在规模上。
  • 也就是说,我刚刚找到aws.amazon.com/blogs/compute/…,所以您可能不必走EC2路线。
  • 哦,很有趣,我刚开始在 EC2 方面,但我也会看看这个。感谢所有帮助
  • 我不明白为什么不这样做。 This diagram 显示 Lambda 函数将消息发送回 websocket 客户端。您可以从 HTTP 请求触发 lambda 函数。因此,您的硬件设备可以使用其 wifi 连接向 lambda 函数发出 HTTP 请求,该函数通过向连接的 websocket 客户端发送数据来响应。
【解决方案2】:

您的应用正在将 express 应用作为使用端口 3000 的子进程执行。

因此,每当用户运行此应用程序时,快速服务器将托管在他们的本地计算机上,并将监听来自端口 3000 的端口请求。

但很遗憾,您无法向此应用程序发出 post 请求。

为什么?他们没有使用服务器操作系统,这个应用程序将只能监听来自本地网络等的请求。总而言之,我认为你的方式有点错误。同样,我想知道是否会有人打开他们的端口来接收来自任何地方的请求。因为这对用户来说风险太大......

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    相关资源
    最近更新 更多