(Я нашел ответ на этот вопрос, решение изложил подробно внизу вопроса)
Доброго дня!
У меня ПОЛНОСТЬЮ не работает 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
Так что вот... если что-то еще найду по этому поводу, добавлю сюда.