Nodejs 使用 node-webkit 保存文件

Nodejs 使用 node-webkit 保存文件

我现在的程序如果使用 npm start 可以保存改变的 json 文件,但是如果把程序打包成 app.nw,然后放到 resources dir 里,就不能保存改变的值了。每次程序重启后还是之前的值。

改为使用 pouchdb 也一样,保存不报错,但是不能真正改变。

如何只是简单地保存一些设置变量?我使用mac。 不会必须使用 file dialog 吧?

5 回复

换 python 写了 舒畅…


localstorage就可以了,indexedb或websql

伤心了,不想试了 py2installer 更好用

当然可以!下面是一个关于如何在 Node-WebKit (NW.js) 应用中保存 JSON 文件的示例代码和说明。

示例代码

首先,确保你已经安装了 fs 模块,这是 Node.js 的内置模块之一,用于文件系统操作。

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

// 定义保存文件的路径
const filePath = path.join(nw.App.dataPath, 'settings.json');

// 示例设置数据
const settingsData = {
    theme: 'dark',
    fontSize: 14,
    showNotifications: true
};

// 保存设置到文件
function saveSettings() {
    fs.writeFile(filePath, JSON.stringify(settingsData, null, 2), (err) => {
        if (err) {
            console.error('Error saving settings:', err);
            return;
        }
        console.log('Settings saved successfully.');
    });
}

// 加载设置文件
function loadSettings() {
    fs.readFile(filePath, 'utf8', (err, data) => {
        if (err) {
            console.error('Error loading settings:', err);
            return;
        }
        try {
            const loadedData = JSON.parse(data);
            Object.assign(settingsData, loadedData);
            console.log('Settings loaded successfully.');
        } catch (parseErr) {
            console.error('Error parsing settings file:', parseErr);
        }
    });
}

// 初始化时加载设置
loadSettings();

// 在需要的时候保存设置
saveSettings();

解释

  1. 引入模块

    • fs 是 Node.js 的内置模块,用于文件系统操作。
    • path 用于处理和转换文件路径。
  2. 定义文件路径

    • nw.App.dataPath 是 NW.js 提供的一个属性,它返回应用程序的数据目录路径。这通常是用户级别的文件夹,可以避免权限问题。
  3. 保存设置

    • fs.writeFile 方法用于将 JSON 数据写入指定路径的文件。这里我们使用 JSON.stringify 将 JavaScript 对象转换为 JSON 字符串,并且设置了缩进以便可读性。
  4. 加载设置

    • fs.readFile 方法用于从文件中读取数据。这里我们将读取的数据解析为 JSON 对象,并将其合并到全局设置对象中。
  5. 初始化和保存

    • loadSettings 函数在应用启动时调用,用于加载之前保存的设置。
    • saveSettings 函数可以在任何时候被调用,用于保存当前的设置。

通过这种方式,你可以确保即使在重新启动应用时,设置也会被正确保存和加载。

对于这个问题,你遇到的情况可能是由于node-webkit(现称为NW.js)的沙箱机制导致的文件系统访问权限问题。默认情况下,网页应用程序没有直接访问本地文件系统的权限,这可以保护用户的隐私和安全。因此,你需要明确指定允许你的应用读写特定路径的文件。

以下是一种解决方法,使用nw.gui.Shell模块中的showSaveDialogshowOpenDialog方法来打开一个文件对话框,让用户选择一个文件进行保存。不过,如果你的目标是简单地保存一些设置变量,你可以考虑将这些设置保存到一个本地JSON文件中,或者使用IndexedDB等客户端存储方案。

示例代码:使用 Node.js 和 NW.js 保存 JSON 文件

const fs = require('fs');
const path = require('path');
const { app } = require('electron'); // 如果使用 Electron
// const nwGui = require('nw.gui'); // 如果使用NW.js

function saveSettings(settings) {
    let settingsFilePath = path.join(app.getPath('userData'), 'settings.json'); // 获取用户数据目录

    fs.writeFile(settingsFilePath, JSON.stringify(settings), (err) => {
        if (err) throw err;
        console.log('Settings saved!');
    });
}

// 使用示例
saveSettings({ theme: 'dark', notifications: true });

解释

  1. 获取用户数据目录:通过app.getPath('userData')获取当前应用的数据目录路径。这确保了文件保存在一个与应用相关的、用户有权写入的目录下。
  2. 保存 JSON 文件:将对象转换为 JSON 字符串,并写入指定的文件路径。这里使用了Node.js的fs模块来处理文件操作。

如果你的应用不是基于Electron,而是完全使用NW.js构建的,那么你需要用nw-gui来代替app模块。

如果想要避免弹出文件对话框,上述代码提供了一种更直接的方法来管理应用的设置,而无需每次运行时都提示用户选择保存位置。这适用于大多数简单的设置存储场景。

回到顶部