node.js TypeError:path必须是绝对path或指定根pathres.sendFile

[add]所以我的下一个问题是,当我尝试添加一个新的依赖(npm install –save socket.io)。 JSON文件也是有效的。 我得到这个错误:无法parsingJSON

npm ERR! Unexpected string npm ERR! File: /Users/John/package.json npm ERR! Failed to parse package.json data. npm ERR! package.json must be actual JSON, not just JavaScript. npm ERR! npm ERR! This is not a bug in npm. npm ERR! Tell the package author to fix their package.json file. JSON.parse 

(不知道这是否允许堆栈溢出,有人请让我知道,如果没有)

所以我一直在试图找出为什么这个错误已经返回。 所有的文件(HTML,JSON,JS)都在我桌面上的同一个文件夹中。 我使用node.js和socket.io(New-ish web开发人员,请不要太苛刻:p)

这是我的JS文件:

 var app = require('express')(); var http = require('http').Server(app); app.get('/', function(req, res){ res.sendFile('index.html'); }); http.listen(3000,function(){ console.log('listening on : 3000'); }); 

这是什么得到返回:

 MacBook-Pro:~ John$ node /Users/John/Desktop/Chatapp/index.js listening on : 3000 TypeError: path must be absolute or specify root to res.sendFile at ServerResponse.sendFile (/Users/John/node_modules/express/lib/response.js:389:11) at /Users/John/Desktop/Chatapp/index.js:5:7 at Layer.handle [as handle_request] (/Users/John/node_modules/express/lib/router/layer.js:76:5) at next (/Users/John/node_modules/express/lib/router/route.js:100:13) at Route.dispatch (/Users/John/node_modules/express/lib/router/route.js:81:3) at Layer.handle [as handle_request] (/Users/John/node_modules/express/lib/router/layer.js:76:5) at /Users/John/node_modules/express/lib/router/index.js:234:24 at Function.proto.process_params (/Users/John/node_modules/express/lib/router/index.js:312:12) at /Users/John/node_modules/express/lib/router/index.js:228:12 at Function.match_layer (/Users/John/node_modules/express/lib/router/index.js:295:3) TypeError: path must be absolute or specify root to res.sendFile at ServerResponse.sendFile (/Users/John/node_modules/express/lib/response.js:389:11) at /Users/John/Desktop/Chatapp/index.js:5:7 at Layer.handle [as handle_request] (/Users/John/node_modules/express/lib/router/layer.js:76:5) at next (/Users/John/node_modules/express/lib/router/route.js:100:13) at Route.dispatch (/Users/John/node_modules/express/lib/router/route.js:81:3) at Layer.handle [as handle_request] (/Users/John/node_modules/express/lib/router/layer.js:76:5) at /Users/John/node_modules/express/lib/router/index.js:234:24 at Function.proto.process_params (/Users/John/node_modules/express/lib/router/index.js:312:12) at /Users/John/node_modules/express/lib/router/index.js:228:12 at Function.match_layer (/Users/John/node_modules/express/lib/router/index.js:295:3) 

错误是非常清楚的,你需要指定一个绝对(而不是相对)path和/或在res.sendFile()configuration对象中设置root 。 例子:

 // assuming index.html is in the same directory as this script res.sendFile(__dirname + '/index.html'); 

或者指定一个根(用作res.sendFile()的第一个参数的基本pathres.sendFile()

 res.sendFile('index.html', { root: __dirname }); 

当传递用户生成的文件path时,指定rootpath会更有用,这个文件path可能包含像..这样的恶意/恶意的部分(例如../../../../../../etc/passwd )。 设置rootpath可以防止这种恶意path被用来访问基本path之外的文件。

尝试添加根path。

 app.get("/", function(req, res) { res.sendFile("index.html", {"root": __dirname}); }); 

如果您信任path,则path.resolve是一个选项:

 var path = require('path'); // All other routes should redirect to the index.html app.route('/*') .get(function(req, res) { res.sendFile(path.resolve(app.get('appPath') + '/index.html')); }); 

错误是非常简单的。 最有可能的原因是你的index.html文件不在根目录下。

或者如果它在根目录中,则相对引用不起作用。

所以你需要告诉服务器文件的确切位置。 这可以通过在NodeJs中使用dirname方法来完成。 用这个代替你的代码:

  app.get('/', function(req, res){ res.sendFile(__dirname + '/index.html'); }); 

确保你的主页前加了斜杠“/”符号。 否则你的path将变成:rootDirectoryindex.html

而你想要的是:rootDirectory / index.html

这可以通过另一种方式解决:

 app.get("/", function(req, res){ res.send(`${process.env.PWD}/index.html`) }); 

process.env.PWD将在进程启动时预先加载工作目录。

在.mjs文件中,我们现在没有__dirname

于是

 res.sendFile('index.html', { root: '.' })