fs.readFile() 返回未定义 [重复]

Posted

技术标签:

【中文标题】fs.readFile() 返回未定义 [重复]【英文标题】:fs.readFile() returns undefined [duplicate] 【发布时间】:2020-06-16 04:06:42 【问题描述】:

我正在尝试显示一个创建节点 http 服务器的 html 页面,当我尝试获取它返回未定义的 html 文件的代码时,这就是代码...

var http = require('http');

var fileContent = function(path, format) 
  var fs = require('fs');
  fs.readFile(path, format, function(error, contents) 
    if (error) throw error;
    return contents;
  );


var server = http.createServer(function (req, res) 
  res.writeHead(200, 'Content-Type': 'text/html');
  page = fileContent('./page.html','utf8');
  console.log(page);
  res.end(page);
).listen(8080);

我打印了错误,

[Error: ENOENT: no such file or directory, open './page.html'] 
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: './page.html'

两个文件在同一个目录

【问题讨论】:

尝试使用绝对 URL,我不确定 fs 模块是否接受相对路径作为有效参数 你能显示你的文件夹结构吗 绝对路径也不行 文件夹 > index.js 和 page.html 虽然我不认为你只是给出相对路径有什么问题,仅供参考***.com/questions/33342984/… 【参考方案1】:

首先,fs.readFile 是异步函数。这意味着不会立即返回答案或阻止线程等待答案。相反,它需要一个回调来让您知道答案何时准备就绪。

其次,我建议使用path模块将__dirname(当前模块的目录名)和文件名合并成绝对文件路径。

我将使用不同的方法提供 3 种解决方案。

方案一、使用回调方法

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

var fileContent = function(path, format, cb) 
  fs.readFile(path, format, function(error, contents) 
    if (error) throw error;
    cb(contents);
  );


var server = http.createServer(function (req, res) 
  res.writeHead(200, 'Content-Type': 'text/html');
  fileContent(path.join(__dirname, 'page.html'), 'utf8', function (page) 
    console.log(page);
    res.end(page);
  );
).listen(8080);

解决方案 2. 使用 .then 的承诺

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

var fileContent = function(path, format) 
  return new Promise(function (resolve, reject) 
    fs.readFile(path, format, function(error, contents) 
      if (error) reject(error);
      else resolve(contents);
    );
  );


var server = http.createServer(function (req, res) 
  res.writeHead(200, 'Content-Type': 'text/html');
  fileContent(path.join(__dirname, 'page.html'), 'utf8')
    .then(function(page) 
      console.log(page);
      res.end(page);
    );
).listen(8080);

解决方案 3. Promise 使用 async/await

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

var fileContent = function(path, format) 
  return new Promise(function (resolve, reject) 
    fs.readFile(path, format, function(error, contents) 
      if (error) reject(error);
      else resolve(contents);
    );
  );


var server = http.createServer(async function (req, res) 
  res.writeHead(200, 'Content-Type': 'text/html');
  var page = await fileContent(path.join(__dirname, 'page.html'), 'utf8');
  console.log(page);
  res.end(page);
).listen(8080);

【讨论】:

以上是关于fs.readFile() 返回未定义 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

等待异步函数导致未定义

fs 库:使用时出错

异步/等待函数,fs.readfile 并将其存储到变量 [重复]

fs.readFile 返回字符串,但每个字符之间有空格并添加字符

如何使节点 fs 与类异步/等待?

JavaScript映射为某些元素返回未定义[重复]