簡體   English   中英

nodejs 沒有創建使用 fs.open 指定的文件並拋出錯誤 4058-ENOENT

[英]nodejs not creating the file that specified using fs.open and throwing error 4058-ENOENT

我正在使用這段代碼來創建和寫入一個新目錄和一個文件。 我剛開始學習nodejs

var lib = {};

lib.baseDir = path.join(__dirname,'/../.data/');

lib.create = function(dir,file,data,callback){

fs.open(lib.baseDir+dir+'/'+file+'.json', 'wx', function(err, fileDescriptor){

if(!err && fileDescriptor){

  var stringData = JSON.stringify(data);

  // Write to file and close it
  fs.writeFile(fileDescriptor, stringData,function(err){
    if(!err){
      fs.close(fileDescriptor,function(err){
        if(!err){
          callback(false);
        } else {
          callback('Error closing new file');
        }
      });
    } else {
      callback('Error writing to new file'+'lib.baseDir');
    }
  });
} else {
  callback(err);
  }
 });
};

但我反復收到錯誤

{ Error: ENOENT: no such file or directory, open 'C:\Users\Jawahr\Documents\GitHub\node-api\.data\test\newFile.json'
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\Jawahr\\Documents\\GitHub\\node- 
api\\.data\\test\\newFile.json' }

在 index.js 中調用這個庫作為

var _data = require('./lib/data');

_data.create('test','newFile', {"asdksadlk" : "asldj"} ,function(err) {
  console.log('this was the error ',err);
});

我已經被困在這里一段時間了,是不是因為pathnamefilename包含部分"C:" ,它在 Windows 10 中有冒號保留字符,如果這是如何解決這個問題。

使用 Windows 10 和 NodeJs 8.6。

你可以試試這個 -

fs.open(lib.baseDir+dir+'/'+file+'.json', 'w', function(err, fileDescriptor){

如果文件存在,看起來“wx”會拋出錯誤 -

'w' - Open file for writing. The file is created (if it does not exist) or truncated (if it exists).

'wx' - Like 'w' but fails if the path exists.

'w+' - Open file for reading and writing. The file is created (if it does not exist) or truncated (if it exists).

'wx+' - Like 'w+' but fails if the path exists.

這里引用

看起來您的文件路徑不存在或不可訪問。 看:

fs.open('/path/is/not/exists/xx.js','wx',(err,fd)=>{
    if (err) {
      console.log(err.message);
    }
});

並得到

 Error: ENOENT: no such file or directory, open '/path/is/not/exists/xx.js'

如果文件已經存在,你會得到類似Error: EEXIST: file already exists, open '...'

最后但並非最不重要。 而不是lib.baseDir+dir+'/'+file+'.json'更好的解決方案是使用path.join(lib.baseDir,dir,file+'.json')來自path模塊

在 fs.open 之前添加對目錄的檢查或創建

if (!fs.existsSync(dir)){
    fs.mkdirSync(dir);
}

然后您的其余代碼將起作用。 因為 fs.open 只在文件不存在時創建文件,它不會創建目錄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM