Я получаю сообщение об ошибке ReferenceError: mainWindow is not defined
, когда пытаюсь запросить блокировку одного экземпляра в приложении ElectronJS.
В документации ничего не говорится о каких-либо требованиях к этой переменной. Однако документы показывают пример переменной myWindow
.
Что здесь происходит и как это исправить?
@AlexanderLeithner Я не могу поделиться кодом с полным приложением. Минимальный воспроизводимый пример — подчеркнутый выше вызов функции. В диалоговом окне ошибки не отображается полное сообщение об ошибке, а функция try-catch не перехватывает ошибку. Также ошибка не появляется, когда строка 8 на скриншоте закомментирована.
Опять же, мы не поможем вам, если вы не поделитесь кодом для воспроизведения проблемы. Вы несете ответственность за отладку, насколько это возможно. Скриншоты не являются MRE, как и фрагмент, показанный на скриншоте. Вы пытались изменить размер диалогового окна ошибки? Кроме того, он появляется в строке 17, но не в строке 8. Консоль основного процесса может отображать полное сообщение об ошибке. Тем не менее, в соответствии с Как спросить, убедитесь, что вы нашли наименьшее количество кода, который надежно выдает сообщение об ошибке, и опубликуйте его здесь. Публикация полного приложения никогда не требуется и всегда осуждается.
@AlexanderLeithner Придет лучший MRE. Изменение размера окна не помогло. Строка 17 совершенно не имеет отношения к строке 8, вот что меня смущает.
Вот код, который я написал, и он безопасен как для 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) { }
}
}
Пожалуйста отредактируйте свой вопрос. Не публикуйте код или сообщения об ошибках в виде изображений! Пожалуйста, найдите ошибку и опубликуйте минимально воспроизводимый пример, чтобы мы могли воспроизвести то, что вы испытываете. Кроме того, сообщение об ошибке ссылается на один из ваших сценариев. Пожалуйста, не забудьте включить и это, если это не основной сценарий. Спасибо!