Как вы можете получить возвращаемое значение асинхронного запроса net.request в приложении electronic.js?

avatar
darrin
1 июля 2021 в 18:31
122
0
0

Я пытаюсь написать электронное приложение, которое просто проверяет, может ли приложение подключиться к серверу через https/http.

Моя проблема заключается в том, что возвращаемая функция, которая тестирует два протокола, является "неопределенной" (console.log в index.html). Мне просто нужно нажать на файл (ping.php) через оба протокола, а затем оценить ответ (в renderer.js), чтобы я мог вывести его в окно приложения (через index.html).

Вот мои файлы:

index.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script
      src="https://code.jquery.com/jquery-3.6.0.min.js"
      integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
      crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
  <div class="row mt-5">
    <div class="col-6">
    </div>
    <button type="button" class="btn btn-success" id="buttonTestNetwork" onclick="getNetworkRequestTestResults()">Test Protocols</button>
  </div>
</div>
<script src="./renderer.js"></script>
</body>
</html>

renderer.js

let list = []

getNetworkRequestTestResults = () => {
  window.electron.getNetworkRequestTestResults().then(result => {
    list = result
    console.log(list)
  })
}

main.js

const {app, BrowserWindow, net, ipcMain} = require('electron')
let win

function createWindow() {
  win = new BrowserWindow({
    width: 1200,
    height: 800,
    webPreferences: {
      preload: `${__dirname}/preload.js`,
      devTools: true
    }
  })

  win.loadFile('index.html').then(() => {

  })
  win.webContents.openDevTools()
}

app.whenReady().then(() => {
  createWindow()
  app.on('window-all-closed', function () {
    if (process.platform !== 'darwin') app.quit()
  })
  app.on('activate', function () {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

ipcMain.handle('getNetworkRequestTestResults', (event) => {
  let info = []
  const list = ['server.com']
  const protocols = [
    {protocol: 'https:', port: 443},
    {protocol: 'http:', port: 80}
  ]
  for (let host of list) {
    for (let protocol of protocols) {
      const request = net.request({
        method: 'POST',
        protocol: protocol.protocol,
        hostname: host,
        port: protocol.port,
        path: '/ping.php'
      })
      request.on('response', (response) => {
        console.log(`STATUS: ${response.statusCode}`)
        info.push(response.statusCode)
        response.on('error', (error) => {
          console.log(`ERROR: ${JSON.stringify(error)}`)
        })
      })
    }
  }
  return info
})

preload.js

const {contextBridge, ipcRenderer} = require('electron')

contextBridge.exposeInMainWorld(
  'electron',
  {
    getNetworkRequestTestResults: () => ipcRenderer.invoke('getNetworkRequestTestResults').then(result => {
      return result
    })
  }
)
Источник

Ответы (0)