RequestSingleInstanceLock возвращает ошибку, предотвращающую блокировку экземпляра в ElectronJS

Я получаю сообщение об ошибке ReferenceError: mainWindow is not defined, когда пытаюсь запросить блокировку одного экземпляра в приложении ElectronJS.

В документации ничего не говорится о каких-либо требованиях к этой переменной. Однако документы показывают пример переменной myWindow.

Что здесь происходит и как это исправить?

Пожалуйста отредактируйте свой вопрос. Не публикуйте код или сообщения об ошибках в виде изображений! Пожалуйста, найдите ошибку и опубликуйте минимально воспроизводимый пример, чтобы мы могли воспроизвести то, что вы испытываете. Кроме того, сообщение об ошибке ссылается на один из ваших сценариев. Пожалуйста, не забудьте включить и это, если это не основной сценарий. Спасибо!

Alexander Leithner 26.11.2022 08:25

@AlexanderLeithner Я не могу поделиться кодом с полным приложением. Минимальный воспроизводимый пример — подчеркнутый выше вызов функции. В диалоговом окне ошибки не отображается полное сообщение об ошибке, а функция try-catch не перехватывает ошибку. Также ошибка не появляется, когда строка 8 на скриншоте закомментирована.

vaid 27.11.2022 01:15

Опять же, мы не поможем вам, если вы не поделитесь кодом для воспроизведения проблемы. Вы несете ответственность за отладку, насколько это возможно. Скриншоты не являются MRE, как и фрагмент, показанный на скриншоте. Вы пытались изменить размер диалогового окна ошибки? Кроме того, он появляется в строке 17, но не в строке 8. Консоль основного процесса может отображать полное сообщение об ошибке. Тем не менее, в соответствии с Как спросить, убедитесь, что вы нашли наименьшее количество кода, который надежно выдает сообщение об ошибке, и опубликуйте его здесь. Публикация полного приложения никогда не требуется и всегда осуждается.

Alexander Leithner 27.11.2022 08:57

@AlexanderLeithner Придет лучший MRE. Изменение размера окна не помогло. Строка 17 совершенно не имеет отношения к строке 8, вот что меня смущает.

vaid 27.11.2022 18:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот код, который я написал, и он безопасен как для Windows, так и для MacOS:

var fs = require('fs')

module.exports = class SingleInstance {
    constructor(){
        this.appName = app.name.split(' ').join('-').toLowerCase()

        this.tmpPath = app.getPath('temp') + '\\' + this.appName + '\\'

        if (process.platform === 'darwin') this.tmpPath  = this.tmpPath.split('\\').join('/')

        if (!fs.existsSync(this.tmpPath)) fs.mkdirSync(this.tmpPath)

        this.lockFilePath = this.tmpPath + 'lock.txt'

        if (this.isSecondInstance()){
            process.exit()
        } else {
            this.updateLockFile()
        }
    }

    updateLockFile(){
        fs.writeFileSync(this.lockFilePath, process.pid.toString())
    }
    
    isSecondInstance(){
        try {
            var pid = fs.readFileSync(this.lockFilePath).toString()

            try {
                var isAlreadyRunning = process.kill(pid, 0)
                //app is the second instance. terminate.
                return true
            } catch(err) { }
        } catch(err) { }
    }
}

Другие вопросы по теме