duboloms
@duboloms
Люблю есть дубы с кетчупом. Веб-разработчик.

Полностью отрубился fs в Electron, что делать (Решен)?

(Я нашел ответ на этот вопрос, решение изложил подробно внизу вопроса)

Доброго дня!
У меня ПОЛНОСТЬЮ не работает fs в electron. Я заметил это, когда просто написал в app.js:
const fs = require('fs');

let fileData = fs.readFileSync("text.txt").toString();
console.log(fileData);

Мне вышла ошибка:
internal/fs/utils.js:219 Uncaught Error: ENOENT: no such file or directory, open 'text.txt'
    at Object.openSync (fs.js:440)
    at Object.func [as openSync] (electron/js2c/asar.js:140)
    at Object.readFileSync (fs.js:342)
    at Object.fs.readFileSync (electron/js2c/asar.js:542)
    at Module../src/assets/js/app.js (app.js:12)
    at __webpack_require__ (bootstrap:19)
    at Object.0 (app.scss?3676:19)
    at __webpack_require__ (bootstrap:19)
    at bootstrap:83
    at bootstrap:83

Кстати, я использую webpack.
Я покопался в интернете, я перепробовал вариантов 7 как это можно исправить, но, все тщетно. Вот самый удачный вариант:
const fs = require('fs');
const path = require('path');

let fileData = fs.readFileSync(path.join(__dirname, "text.txt")).toString();
console.log(fileData);

После этого самого "удачного варианта" вылетела другая ошибка:
Uncaught Error: ENOENT: no such file or directory, open '\text.txt'
    at Object.openSync (fs.js:440)
    at Object.func [as openSync] (electron/js2c/asar.js:140)
    at Object.readFileSync (fs.js:342)
    at Object.fs.readFileSync (electron/js2c/asar.js:542)
    at Module.<anonymous> (app.js:13)
    at Module../src/assets/js/app.js (app.js:17)
    at __webpack_require__ (bootstrap:19)
    at Object.0 (app.scss?3676:19)
    at __webpack_require__ (bootstrap:19)
    at bootstrap:83

После чего, я понял что дело пахнет керосином.
Попробовал просто создать файл text2.txt:
const fs = require("fs");

fs.writeFile("text2.txt", "Привет, soso!");


Схватил ошибку:
Uncaught TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received undefined
    at maybeCallback (fs.js:135)
    at Object.writeFile (fs.js:1234)
    at Module../src/assets/js/app.js (app.js:13)
    at __webpack_require__ (bootstrap:19)
    at Object.0 (app.scss?3676:19)
    at __webpack_require__ (bootstrap:19)
    at bootstrap:83
    at bootstrap:83


Что мне делать?
Я уже включил nodeIntegration в main.js!
Вот мой package.json:
{
  "name": "electron",
  "productName": "electron",
  "version": "1.0.0",
  "description": "My Electron application description",
  "main": "electron/main.js",
  "scripts": {
    "start": "electron-forge start",
    "package": "electron-forge package",
    "make": "electron-forge make",
    "publish": "electron-forge publish",
    "lint": "echo \"No linting configured\"",
    "dev": "webpack-dev-server --open --config ./webpack/webpack.dev.conf.js",
    "build": "webpack --config ./webpack/webpack.build.conf.js"
  },
  "keywords": [],
  "author": "",
  "license": "MIT",
  "config": {
    "forge": {
      "packagerConfig": {},
      "makers": [
        {
          "name": "@electron-forge/maker-squirrel",
          "config": {
            "name": "electron"
          }
        },
        {
          "name": "@electron-forge/maker-zip",
          "platforms": [
            "darwin"
          ]
        },
        {
          "name": "@electron-forge/maker-deb",
          "config": {}
        },
        {
          "name": "@electron-forge/maker-rpm",
          "config": {}
        }
      ]
    }
  },
  "dependencies": {
    "electron-squirrel-startup": "^1.0.0"
  },
  "devDependencies": {
    "@electron-forge/cli": "^6.0.0-beta.51",
    "@electron-forge/maker-deb": "^6.0.0-beta.51",
    "@electron-forge/maker-rpm": "^6.0.0-beta.51",
    "@electron-forge/maker-squirrel": "^6.0.0-beta.51",
    "@electron-forge/maker-zip": "^6.0.0-beta.51",
    "css-loader": "^3.5.3",
    "electron": "9.0.2",
    "file-loader": "^6.0.0",
    "mini-css-extract-plugin": "^0.9.0",
    "node-sass": "^4.14.1",
    "sass-loader": "^8.0.2",
    "style-loader": "^1.2.1",
    "webpack": "^4.43.0",
    "webpack-cli": "^3.3.11",
    "webpack-dev-server": "^3.11.0",
    "webpack-node-externals": "^1.7.2"
  }
}


Но если запустить просто файл с прочиткой text.txt то все работает (с помощью команды в коммандной строке: node app.js)

-------------------------------------------------
Ответ, который сработал для меня:

ИЗМЕНЕНО (оставляю памятку, для тех кто тоже столкнулся с такое проблемой):
Я нашел ответ, все не работало из-за __dirname, из-за webpack, он выдавал мне просто / :

console.log(__dirname); // выдавал мне /  (  / - это символ слеш если что)

Нужно было в webpack.conf.js написать:
node: {
  __dirname: true
}

Вообще, лучше (если вы используете nodeJS) поставить свойство global: true (а также __filename): - оно сделает все функции nodejs валидными, или другими словами, не будет мешать nodejs делать свою работу:
node: {
  global: true,
  __dirname: true,
  __filename: true
}

Подробнее о node свойстве в webpack.conf.js тут: https://webpack.js.org/configuration/node/
После чего, я попробовал вывести __dirname:
console.log(__dirname); // выдает src/assets/js/app.js

Вот работающий readFileSync:
let fileData = fs.readFileSync(__dirname + "/text.txt").toString();
console.log(fileData); // выдает: "Привет, soso!"


В общем, сам fs работал, в writeFile, я просто не указал во 2-ом параметре коллбэк обработки ошибки (или 3-ем если вы передаете дополнительный параметр "utf-8") err => if(err) console.log(err);
Пример:
const fs = require("fs");

fs.writeFile("/text2.txt", "Привет", err => { if(err) console.log(err) });
// или
const fs = require("fs");

fs.writeFile("/text2.txt", "Привет", "utf-8", err => { if(err) console.log(err) });

Подробнее (а также это место где я нашел информацию о том, что webpack блокирует __dirname):
https://github.com/webpack/webpack/issues/1599

Так что вот... если что-то еще найду по этому поводу, добавлю сюда.
  • Вопрос задан
  • 678 просмотров
Решения вопроса 1
duboloms
@duboloms Автор вопроса
Люблю есть дубы с кетчупом. Веб-разработчик.
-------------------------------------------------
Ответ, который сработал для меня:

ИЗМЕНЕНО (оставляю памятку, для тех кто тоже столкнулся с такое проблемой):
Я нашел ответ, все не работало из-за __dirname, из-за webpack, он выдавал мне просто / :

console.log(__dirname); // выдавал мне /  (  / - это символ слеш если что)

Нужно было в webpack.conf.js написать:
node: {
  __dirname: true
}

Вообще, лучше (если вы используете nodeJS) поставить свойство global: true (а также __filename): - оно сделает все функции nodejs валидными, или другими словами, не будет мешать nodejs делать свою работу:
node: {
  global: true,
  __dirname: true,
  __filename: true
}

Подробнее о node свойстве в webpack.conf.js тут: https://webpack.js.org/configuration/node/
После чего, я попробовал вывести __dirname:
console.log(__dirname); // выдает src/assets/js/app.js

Вот работающий readFileSync:
let fileData = fs.readFileSync(__dirname + "/text.txt").toString();
console.log(fileData); // выдает: "Привет, soso!"


В общем, сам fs работал, в writeFile, я просто не указал во 2-ом параметре коллбэк обработки ошибки (или 3-ем если вы передаете дополнительный параметр "utf-8") err => if(err) console.log(err);
Пример:
const fs = require("fs");

fs.writeFile("/text2.txt", "Привет", err => { if(err) console.log(err) });
// или
const fs = require("fs");

fs.writeFile("/text2.txt", "Привет", "utf-8", err => { if(err) console.log(err) });

Подробнее (а также это место где я нашел информацию о том, что webpack блокирует __dirname):
https://github.com/webpack/webpack/issues/1599
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы