Skip to content
困った時に思い出したい

[Electron] TypeError [ERR_INVALID_ARG_TYPE]: The “path” argument must be one of type string, Buffer, or URL. Received type object が出たとき

electron, nodejs1 min read

環境

  • macOS 10.15.1
  • Node.js 12.13.1
  • Electron 7.1.2

概要

ファイル保存のために書いたコードを実行したところ、コンソールにて以下が表示された。

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を返すようになっている。

  • canceled Boolean – whether or not the dialog was canceled.
  • filePath String (optional) If the dialog is canceled this will be undefined.
  • bookmark String (optional) macOS mas – Base64 encoded string which contains the security scoped bookmark data for the saved file. securityScopedBookmarks must be enabled for this to be present.

参考: 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);
});
}

これで本来意図したようにファイルの保存ができるようになった。

© 2021 by 困った時に思い出したい. All rights reserved.
Theme by LekoArts