我一直在尝试在使用Node.js时写入文件,但没有成功。我该怎么做?


当前回答

好的,这很简单,因为Node有内置的功能,它叫做fs,代表文件系统,基本上,NodeJS文件系统模块。。。

因此,首先需要在server.js文件中使用它,如下所示:

var fs = require('fs');

fs有几种方法可以写入文件,但我的首选方法是使用appendFile,这将把内容附加到文件中,如果文件不存在,将创建一个,代码如下:

fs.appendFile('myFile.txt', 'Hi Ali!', function (err) {
  if (err) throw err;
  console.log('Thanks, It\'s saved to the file!');
});

其他回答

你当然可以让它更高级一点。非阻塞、写入位和段,而不是一次写入整个文件:

var fs = require('fs');
var stream = fs.createWriteStream("my_file.txt");
stream.once('open', function(fd) {
  stream.write("My first row\n");
  stream.write("My second row\n");
  stream.end();
});

您可以使用fs(文件系统)模块写入文件。

以下是您可以如何做到的示例:

const fs = require('fs');

const writeToFile = (fileName, callback) => {
  fs.open(fileName, 'wx', (error, fileDescriptor) => {
    if (!error && fileDescriptor) {
      // Do something with the file here ...
      fs.writeFile(fileDescriptor, newData, (error) => {
        if (!error) {
          fs.close(fileDescriptor, (error) => {
            if (!error) {
              callback(false);
            } else {
              callback('Error closing the file');
            }
          });
        } else {
          callback('Error writing to new file');
        }
      });
    } else {
      callback('Could not create new file, it may already exists');
    }
  });
};

您可能还希望通过使用Promise和async/await语句来消除回调代码结构中的回调。这将使异步代码结构更加平坦。为此,可以使用一个方便的util.provify(原始)函数。它使我们能够从回调转向承诺。看看下面的fs函数示例:

// Dependencies.
const util = require('util');
const fs = require('fs');

// Promisify "error-back" functions.
const fsOpen = util.promisify(fs.open);
const fsWrite = util.promisify(fs.writeFile);
const fsClose = util.promisify(fs.close);

// Now we may create 'async' function with 'await's.
async function doSomethingWithFile(fileName) {
  const fileDescriptor = await fsOpen(fileName, 'wx');

  // Do something with the file here...

  await fsWrite(fileDescriptor, newData);
  await fsClose(fileDescriptor);
}

文件系统API中有很多细节。最常见的方法是:

const fs = require('fs');

fs.writeFile("/tmp/test", "Hey there!", function(err) {
    if(err) {
        return console.log(err);
    }
    console.log("The file was saved!");
}); 

// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');

同步写入

fs.writeFileSync(文件,数据[,选项])

fs = require('fs');

fs.writeFileSync("foo.txt", "bar");

异步写入

fs.writeFile(文件,数据[,选项],回调)

fs = require('fs');

fs.writeFile('foo.txt', 'bar', (err) => { if (err) throw err; });

哪里

file <string> | <Buffer> | <URL> | <integer> filename or file descriptor
data <string> | <Buffer> | <Uint8Array>
options <Object> | <string>
callback <Function>

值得阅读官方文件系统(fs)文档。

更新:async/await

fs = require('fs');
util = require('util');
writeFile = util.promisify(fs.writeFile);

fn = async () => { await writeFile('foo.txt', 'bar'); }

fn()

我知道关于“写”的问题,但在更一般的意义上,“附加”在某些情况下可能有用,因为它很容易在循环中使用,以便向文件中添加文本(无论文件是否存在)。如果要添加行,请使用“\n”,例如:

var fs = require('fs');
for (var i=0; i<10; i++){
    fs.appendFileSync("junk.csv", "Line:"+i+"\n");
}