node.js TypeError:path必须是绝对的或指定root到res.sendFile [无法解析JSON]

IE8*_*ome 134 javascript dependencies json node.js socket.io

[add]所以我的下一个问题是,当我尝试添加一个新的依赖(npm install --save socket.io).JSON文件也有效.我收到此错误:无法解析json

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 
Run Code Online (Sandbox Code Playgroud)

所以我一直试图弄清楚为什么这个错误已经回归.所有文件(HTML,JSON,JS)都在我桌面上的同一文件夹中.我正在使用node.js和socket.io

这是我的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');
});
Run Code Online (Sandbox Code Playgroud)

这是返回的内容:

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)
Run Code Online (Sandbox Code Playgroud)

msc*_*dex 294

错误很明显,您需要root在config对象中指定绝对(而不是相对)路径和/或设置res.sendFile().例子:

// assuming index.html is in the same directory as this script

res.sendFile(__dirname + '/index.html');
Run Code Online (Sandbox Code Playgroud)

或指定一个根(用作第一个参数的基本路径res.sendFile():

res.sendFile('index.html', { root: __dirname });
Run Code Online (Sandbox Code Playgroud)

root当您传递用户生成的文件路径时,指定路径会更有用,该路径可能包含格式错误/恶意的部分,例如..(例如../../../../../../etc/passwd).设置root路径可防止此类恶意路径被用于访问该基本路径之外的文件.

  • 将根指定为目录的最佳方法是什么? (3认同)
  • @SuperUberDuper 你的意思是像`path.resolve(__dirname, '.../public')`?这将解析为脚本父目录的“public”子目录。 (2认同)
  • @SuperUberDuper < - 这家伙说得对(至少对我而言).他正在使用resolve函数来规范化路径,允许您使用`../../ <etc>`类型语法进行导航.注意`__dirname`和`../ public`之间的逗号.使用+号不起作用. (2认同)

kee*_*eri 19

尝试添加根路径.

app.get('/', function(req, res) {
    res.sendFile('index.html', { root: __dirname });
});
Run Code Online (Sandbox Code Playgroud)


Eli*_*oss 11

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

于是

res.sendFile('index.html', { root: '.' })
Run Code Online (Sandbox Code Playgroud)


小智 8

我使用下面的代码并尝试显示 sitemap.xml 文件

router.get('/sitemap.xml', function (req, res) {
    res.sendFile('sitemap.xml', { root: '.' });
});
Run Code Online (Sandbox Code Playgroud)