简体   繁体   English

将数据存储到系统时电子应用程序崩溃(应用程序退出代码 3221225477)

[英]Electron app crashes when storing data to system (app exited with code 3221225477)

I am working on an electron app, and I'm using an the following class implementation to save and retrieve data from the user's disk.我正在开发一个电子应用程序,我正在使用以下类实现来保存和检索用户磁盘中的数据。 Sometimes this functions correctly, however, on occasion the program will crash and output this error.有时这可以正常运行,但是,有时程序会崩溃并输出此错误。

app exited with code 3221225477应用程序以代码 3221225477 退出

I am not too sure what is causing this issue.我不太确定是什么导致了这个问题。 I understand this error code means there is an access violation occurring, but I'm not sure why that is.我理解这个错误代码意味着发生了访问冲突,但我不确定为什么会这样。 Potentially could be the implementation of the class.可能是该类的实现。 I simply took the implementation from here https://medium.com/cameron-nokes/how-to-store-user-data-in-electron-3ba6bf66bc1e我只是从这里获取实现https://medium.com/cameron-nokes/how-to-store-user-data-in-electron-3ba6bf66bc1e

There are also occasions when this occurs randomly too, so it may not be the Store implementation.这也有随机发生的情况,所以它可能不是 Store 实现。

const electron = require('electron');
const path = require('path');
const fs = require('fs');


class Store {
  constructor(opts) {
    // Renderer process has to get `app` module via `remote`, whereas the main process can get it directly
    // app.getPath('userData') will return a string of the user's app data directory path.
    const userDataPath = (electron.app || electron.remote.app).getPath('userData');
    // We'll use the `configName` property to set the file name and path.join to bring it all together as a string
    this.path = path.join(userDataPath, opts.configName + '.json');
    
    this.data = parseDataFile(this.path, opts.defaults);
  }
  
  // This will just return the property on the `data` object
  get(key) {
    const val = this.data[key];
    console.log('Get', key, val);
    return val;
  }
  
  // ...and this will set it
  set(key, val) {
    console.log('Set', key, val)
    this.data[key] = val;
    // Wait, I thought using the node.js' synchronous APIs was bad form?
    // We're not writing a server so there's not nearly the same IO demand on the process
    // Also if we used an async API and our app was quit before the asynchronous write had a chance to complete,
    // we might lose that data. Note that in a real app, we would try/catch this.
    fs.writeFileSync(this.path, JSON.stringify(this.data));
  }
}

function parseDataFile(filePath, defaults) {
  // We'll try/catch it in case the file doesn't exist yet, which will be the case on the first application run.
  // `fs.readFileSync` will return a JSON string which we then parse into a Javascript object
  try {
    return JSON.parse(fs.readFileSync(filePath));
  } catch(error) {
    // if there was some kind of error, return the passed in defaults instead.
    return defaults;
  }
}

// expose the class
module.exports = Store;

I seem to have discovered the reason for this issue.我似乎已经找到了这个问题的原因。 The following post contains a comment which says以下帖子包含评论说

Keep a global reference of the window object, if you don't, the window will be closed automatically when the JavaScript object is garbage collected.保持窗口对象的全局引用,如果不这样做,当 JavaScript 对象被垃圾回收时,窗口将自动关闭。

https://stackoverflow.com/a/59796326/7259551 https://stackoverflow.com/a/59796326/7259551

Simply making the instance of BrowserWindow a global value fixed this issue.只需将 BrowserWindow 的实例设置为全局值即可解决此问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM