Javascript 运行到node.js TypeError:第一个参数必须是字符串或缓冲区,并使用尽可能简单的脚本

Javascript 运行到node.js TypeError:第一个参数必须是字符串或缓冲区,并使用尽可能简单的脚本,javascript,html,node.js,Javascript,Html,Node.js,所以我在阅读时遇到了一个错误 TypeError:运行node.js脚本时,第一个参数必须是字符串或缓冲区,在大量stackoverflow和tutorial Google搜索之后,我找不到解决方案,因此我创建了从node.js教程复制粘贴的示例代码,它仍然返回TypeError。有关守则是: var http = require('http'); var fs = require('fs'); http.createServer(function (req, res) { //Open a

所以我在阅读时遇到了一个错误 TypeError:运行node.js脚本时,第一个参数必须是字符串或缓冲区,在大量stackoverflow和tutorial Google搜索之后,我找不到解决方案,因此我创建了从node.js教程复制粘贴的示例代码,它仍然返回TypeError。有关守则是:

var http = require('http');
var fs = require('fs');
http.createServer(function (req, res) {
  //Open a file on the server and return it's content:
  fs.readFile('demofile1.html', function(err, data) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);
demofile1.html:

<html>
<body>
<h1>My Header</h1>
<p>My paragraph.</p>
</body>
</html>
我假设我的环境一定出了问题,但我已经安装了node.js并手动运行了npm install fs,所有这些都没有用。我可以很好地运行其他node.js服务器,但当我尝试使用fs读取html文件时会出现错误


谢谢

我不推荐W3Schools作为一个值得尊敬的教程来源,这是一个很好的例子,为什么不呢:他们不教错误处理之类的好习惯。因为您复制并粘贴了示例,所以您的错误相当隐晦。然而,通过良好的错误处理,您的错误会更早地被发现,并为您提供一个更好的错误指示

考虑到这一点,请尝试以下方法:

var http = require('http');
var fs = require('fs');
http.createServer(function (req, res) {
  //Open a file on the server and return it's content:
  fs.readFile('demofile1.html', function(err, data) {
    if (err) throw err; // crash with actual error instead of assuming success
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);
看起来demofile1.html与启动服务器的路径不同

我建议:

尝试将server.js或任何您命名的js文件放置在与demofile1.html相同的路径中,然后重试 如果子文件夹上需要它们,请尝试使用绝对路径导航,或者使用一些npm扩展,如 在fs回调中,尝试记录数据,这也是确保应用程序不会崩溃的良好实践
您的代码尚未检查err是否包含错误。我猜您可能是从不同的目录运行脚本,因此fs.readFile会检查错误的位置,因此数据可能未定义。此外,fs是一个内部模块,您不应使用npm install fs安装它,因为它安装了一个第三方库,这是不必要的。使用existsSync see不是一个好的做法,因为它会在文件系统中产生竞争条件,例如,您检查是否存在,返回true,在将文件读入缓冲区之前,其他进程会立即删除该文件。您应该尝试读取文件并相应地处理任何错误;这取决于文件的使用情况。对于这个问题,我看到用户依赖于文件的内容,因此验证它是否存在可以导致一个单独的流来处理超出问题范围的情况。同意需要更好的错误处理。开始问这个问题时,node感到非常愚蠢,显然,当.js文件位于子文件夹中时,node并没有查看该文件所在的路径,而是查看终端当前cd插入的路径。我从一个子文件夹运行js文件,但没有在路径名中包含该子文件夹。谢谢
var http = require('http');
var fs = require('fs');
http.createServer(function (req, res) {
  //Open a file on the server and return it's content:
  fs.readFile('demofile1.html', function(err, data) {
    if (err) throw err; // crash with actual error instead of assuming success
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);