无法破坏属性`'不确定的'或null'
原始错误显示:
无法解构“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
是真还是假的那一行。
首先,不要像这样声明
var { firstTime, .. } 之类的对象。如果这样做,
firstTime
将成为匿名对象的属性。您永远无法在其他地方访问它。检查
userAccount.get('user')
函数的输出是什么,输出包含一些对象,例如
{ firstime: true, accountid: "test", profileid: "test" } ,然后尝试此方法。希望这对您有所帮助。
var result=userAccount.get('user');
if(result.firstTime===true){
//your code
}
这是
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;
}