— electron, nodejs — 1 min read
ファイル保存のために書いたコードを実行したところ、コンソールにて以下が表示された。
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be one of type string, Buffer, or URL. Received type object
パスが文字列でなくオブジェクトで渡されているとのこと。
実行したコードを抜粋
function saveAsNewFile() { return Promise.all([ showSaveAsNewFileDialog(), mainWindow.requestText() ]) .then(([filePath, text]) => fileManager.saveFile(filePath, text)) .catch((error) => { console.log(error); });}
class FileManager { constructor() { this.filePath = ""; } saveFile(filePath, text) { return new Promise((resolve) => { fs.writeFileSync(filePath, text); this.filePath = filePath; resolve(); }); }}
import { dialog } from "electron";function showSaveAsNewFileDialog() { return new Promise((resolve, reject) => { const file = dialog.showSaveDialog( { title: "save", filters: [ { name: "markdown file", extensions: [ "md" ] } ] } ); if (file) { resolve(file); } else { reject(); } });}export default showSaveAsNewFileDialog;
これは少し前に出版された書籍にあったサンプルコードの一部で、書籍にて指定されているElectronのバージョンは1.6.1。実際に6.0以前のバージョンでは showSaveDialog が stringを返していた。
参考: electron/dialog.md at v5.0.12 · electron/electron
で、Electron 6.0以降は showSaveDialog が次のオブジェクトを含むPromiseを返すようになっている。
参考: electron/dialog.md at v6.0.0-beta.1 · electron/electron
実際に中を見てみる
saveFile(filePath, text) { console.log(filePath); return new Promise((resolve) => { fs.writeFileSync(filePath, text); this.filePath = filePath; resolve(); });}
このconsolo.log(filePath)で返ってきたのは
{ filePath: '/Users/USER_NAME/document/example.md', canceled: false }
なので、saveFileに渡すfilePathをこのように変えて
fileManager.saveFile(filePathObj.filePath, text)
function saveAsNewFile() { return Promise.all([ showSaveAsNewFileDialog(), mainWindow.requestText() ]) .then(([filePathObj, text]) => fileManager.saveFile(filePathObj.filePath, text)) .catch((error) => { console.log(error); });}
これで本来意図したようにファイルの保存ができるようになった。