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时,指定root
path会更有用,这个文件path可能包含像..
这样的恶意/恶意的部分(例如../../../../../../etc/passwd
)。 设置root
path可以防止这种恶意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: '.' })