Невозможно отправить функцию процессу электронного рендерера из основного процесса - PullRequest
0 голосов
/ 20 февраля 2020

Я хотел бы отправить функцию из моего основного процесса визуализации

У меня есть функция, которую я экспортирую из db.services.js модуля

// db.services.js
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert')

var DatabaseService = (function () {
    "use strict";
    var instance; //prevent modification of "instance" variable
    function Singleton() {
        if (instance) {
            return instance;
        }
        instance = this;
    }

    Singleton.create = function (db_uri) {
        //Singleton initialization code
        this.db_uri = db_uri
        this.db = undefined
        this.a = 0 // debugging async behavior
    }

    //instance accessor
    Singleton.getInstance = function () {
        return instance || new Singleton();
    };

    Singleton.getDB = function () {
        return this.db.db('xFilterDB') // directly return the used DB
    }

    Singleton.establishConnection = function (callback) {
        ... 
    }

    return Singleton;
}());

// exporting a "singleton" object to use with all views
DatabaseService.getInstance();

module.exports = DatabaseService;

Я 'импортирую' функцию в мой основной электронный процесс app.js

// app.js

const {
    app,
    BrowserWindow,
    ipcMain
} = require('electron');

const isDev = require('electron-is-dev');
const DatabaseService = require('./services/db.services'); 
app.on('ready', function () {
    DatabaseService.getInstance();
    DatabaseService.create("mongodb://localhost:27017");

    mainWindow = new BrowserWindow({
        width: 1024,
        height: 768,
        webPreferences: {
            nodeIntegration: true
        }
    })
    let url = 'file://' + __dirname + '/views/main.html'
    mainWindow.loadURL(url)
    mainWindow.webContents.on('did-finish-load', () => {
        console.log(DatabaseService);

        // 
        // [Function: Singleton] {
        //   create: [Function],
        //   getInstance: [Function],
        //   getDB: [Function],
        //   establishConnection: [Function],
        //   db_uri: 'mongodb://localhost:27017',
        //   db: undefined,
        //   a: 0
        // }

        mainWindow.webContents.send('database-service', 
            DatabaseService);  // <-- I am sending the function here
    });
    windows.push(mainWindow)
}

В основной. html Я

<script>
        require('./main.js')
</script>

И в основной. js

//main.js

ipcRenderer.on('database-service', (event, args) => {
    // ----- mongo connection ESTABLISH REGION START----
    // implicit async
    console.log(args); // <-- args is null here 
    ...
}

Любая идея, что здесь происходит не так?

Также, очевидно, это webContents.send('database-service', DatabaseService) устарело. Так что лучшее решение будет оценено вдвойне.

1 Ответ

0 голосов
/ 20 февраля 2020

Невозможно отправить функцию по IP-каналу C, поскольку она не может быть сериализована.

из документы :

Отправить асинхронное сообщение на процесс рендеринга через канал вместе с аргументами. Аргументы будут сериализованы с помощью алгоритма структурированного клонирования, как и postMessage, поэтому цепочки прототипов не будут включены. Отправка функций, обещаний, символов, WeakMaps или WeakSets вызовет исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...