开发者问题收集

无法破坏属性`'不确定的'或null'

2018-12-11
6797

原始错误显示: 无法解构“undefined”或“null”的属性“firstime”

我正在使用 node.js Electron 为 Windows PC 开发基于 Web 的桌面应用程序。 我正在尝试将一些数据保存在用户数据目录中,我在 链接中找到了这个想法并使用了相同的方法。

写入和获取数据工作正常,但是错误发生在第一次获取数据时。

这是 UserPreferences 类的代码

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

class UserPreferences {
    constructor(opts) {
            const userDataPath = (electron.app || electron.remote.app).getPath('userData');
            this.path = path.join(userDataPath, opts.configName + '.json');
            this.data = parseDataFile(this.path, opts.defaults);
            console.log(userDataPath); 
        }
    get(key) {
            return this.data[key];
        }
    set(key, val) {
        this.data[key] = val;
        fs.writeFileSync(this.path, JSON.stringify(this.data));
    }
}

function parseDataFile(filePath, defaults) {
    try {
        return JSON.parse(fs.readFileSync(filePath));
    } catch (error) {
        return defaults;
    }
}

module.exports = UserPreferences;

这是使用 UserPreferences 类的函数

function isFirstTime() {
            try{
                const userAccount = new UserPreferences({
                configName: 'fipes-user-preferences', // We'll call our data file 'user-preferences'
                defaults: {

                    user: { firstime: true, accountid: 0, profileid: '' }
                }
                });

                var { firstime, accountid, profileid } = userAccount.get('user');

                if (firstime === true) {  //check if firstime of running application
                    //do something
                } else {
                    //do something
                }   
            }catch(err){
                console.log(err.message);
            }
        }

错误发生在我检查 firstime 是真还是假的那一行。

2个回答

首先,不要像这样声明 var { firstTime, .. } 之类的对象。如果这样做, firstTime 将成为匿名对象的属性。您永远无法在其他地方访问它。检查 userAccount.get('user') 函数的输出是什么,输出包含一些对象,例如 { firstime: true, accountid: "test", profileid: "test" } ,然后尝试此方法。希望这对您有所帮助。

var result=userAccount.get('user');
if(result.firstTime===true){
  //your code
}
R.Sarkar
2018-12-11

这是 UserPreferences 的一个版本,在您编写代码时使用起来会更自然。您可以像在 isFirstTime 中看到的那样创建它。

console.debug(userPreferences[accountId]);
userPreferences[accountId] = 1;

这是首选,因为开发人员没有理由不将 UserPreferences 视为对象。另一个好主意是将写入文件分离到单独的 flush 方法中,以防您经常更新首选项。

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

class UserPreferences {
    constructor(defaultPrefs, pathToPrefs) {
        const app = electron.app || electron.remote.app;
        this.pathToPrefs = path.join(app.getPath("userData"), pathToPrefs + ".json");

        try {
            this.store = require(this.pathToPrefs);
        }
        catch (error) {
            this.store = defaultPrefs;
        }
        return new Proxy(this, {
            get(target, property) {
                return target.store[property];
            },
            set(target, property, value) {
                target.store[property] = value;
                fs.writeFileSync(target.pathToPrefs, JSON.stringify(target.store));
            }
        });
    }
}

module.exports = UserPreferences;

这是 isFirstTime 的纯版本,它应该可以执行您想要的操作,同时保持更强大的检查 isFirstTime 的方法。检查也可以更改,因此检查 lastSignIn 是否等于 createdAt (当然,具有适当的默认值)。

function isFirstTime() {
    const account = new UserPreferences({
        user: {
            accountId: 0,
            createdAt: new Date(),
            lastSignIn: null,
            profileId: ""
        }
    }, "fipes-user-preferences");

    const {lastSignIn} = account;

    return lastSignIn === null;
}
Aanand Kainth
2018-12-11