Node.js加载文件

70

我想使用nodejs加载test.txt。

var fs = require('fs');
fs.readFile('./test.txt', function (err, data) {
  if (err) {
    throw err; 
  }
  console.log(data);
});

服务器的路径是C:\server\test\server.js。 test.txt位于同一目录中,但我收到了此错误:Error: ENOENT, no such file or directory 'C:\Users\User\test.txt'

6个回答

92

在Node中,路径是相对于当前工作目录解析的。在你的路径前加上__dirname以将路径解析到你的Node脚本所在的位置。

var fs = require('fs');
fs.readFile( __dirname + '/test.txt', function (err, data) {
  if (err) {
    throw err; 
  }
  console.log(data.toString());
});

我得到了“ReferenceError: __dirname未定义”的错误。这是因为我需要手动定义“var __dirname ='/the/path/'”吗? - myfirsttime1
2
@myfirsttime1 __dirname 只在 Node 脚本中有效,而不适用于 REPL。 - Rob W

20

使用Node 0.12,现在可以同步执行此操作:

  var fs = require('fs');
  var path = require('path');

  // Buffer mydata
  var BUFFER = bufferFile('../test.txt');

  function bufferFile(relPath) {
    return fs.readFileSync(path.join(__dirname, relPath)); // zzzz....
  }

fs 是文件系统。 readFileSync() 返回一个Buffer,如果要求,则返回字符串。

fs 正确地认为相对路径是安全问题。 path 是一个解决方法。

要加载为字符串,请指定编码:

return fs.readFileSync(path,{ encoding: 'utf8' });

6

您应该使用__dirname来获取文件所在的目录名,而不是当前工作目录:

fs.readFile(__dirname + "/test.txt", ...);

3
使用 pathfs:
const fs = require("fs");
const pth = require("path");

同步:

let data = fs.readFileSync(pth.join(__dirname,"file.txt"));
console.log(data + "");

异步:

fs.readFile(pth.join(__dirname,"file.txt"), (err, data) => {
    console.log(data + "");
});

如果需要持续读取文件并将其发送给客户端,而且文件不是很大,则可以尝试保存一份副本:

const exp = require("express");
const app = exp();
const fs = require("fs");
const pth = require("path");

let file = "";
app.get("/file", (q, r) => {
    if (file === "")
        file = fs.readFileSync(pth.join(__dirname,"file.txt")) + "";

    r.writeHead(200, { "Content-Type": "text/plain" });
    r.write(file);
    r.end();
});

1

所以如果它在同一个目录中,只需执行以下操作

 fs.readFile(__dirname+'/foo.txt',function(e,d){console.log(d)})

Rob它完全可以...我刚在Node终端里做了。 - samccone
2
创建位于/tmp/x/x.js的文件。将OPs代码放入其中。同时创建/tmp/x/test.txt。现在将工作目录设置为/tmp(例如 cd /tmp),使用node x/x.jsnode /tmp/x/x.js --> Error: ENOENT, no such file or directory 'test.txt' - Rob W
4
你原来的回答与提问者使用的代码几乎相同(都不能运行),所以才会出现“笑死”的争论。 - Esailija

0

如果它们在同一个目录下,它应该可以工作。我已经使用相同的代码和文件name.txt进行了测试,它运行良好:

var fs = require('fs');
fs.readFile('./test.txt', function (err, data) {
  if (err) {
    throw err;
  }
  console.log(data.toString());
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接