node.js 类型错误:路径必须是绝对路径或指定 root 到 res.sendFile [解析 JSON 失败]

IT技术 javascript json node.js socket.io dependencies
2021-03-01 23:27:07

[添加] 所以我的下一个问题是,当我尝试添加新的依赖项时(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 

所以我一直在试图弄清楚为什么这个错误一直在返回。所有文件(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');
});

这是返回的内容:

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)
6个回答

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

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

res.sendFile(__dirname + '/index.html');

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

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

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

嗨,我尝试了以下res.sendFile(path.resolve(__dirname + '/index.html', '../'))但得到消息:无法获取 /
2021-04-18 23:27:07
将根指定为目录的最佳方法是什么?
2021-04-22 23:27:07
凉爽的!将来会将此值永久存储在 __dirname 中吗?
2021-05-03 23:27:07
@SuperUberDuper <-- 这家伙说得对(至少对我而言)。他正在使用解析函数来规范化路径,允许您使用../../<etc>类型语法进行导航注意之间的逗号__dirname../public使用 + 号不起作用。
2021-05-04 23:27:07
@SuperUberDuper 你的意思是像path.resolve(__dirname, '.../public')这将解析为脚本父目录的“public”子目录。
2021-05-12 23:27:07

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

因此

res.sendFile('index.html', { root: '.' })
对于handelbars 中的SITEMAP.XML,这是正确的解决方案。非常感谢你
2021-04-27 23:27:07
这对我来说是一个很好的解决方案,因为我的要求是在通过 __dirname 获取路径后返回。所以我给了 res.sendFile('index.html', { root: './public/views' });
2021-05-14 23:27:07

尝试添加根路径。

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

如果您信任该路径,则 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');
});

确保在主页前添加斜杠“/”符号。否则你的路径会变成:rootDirectoryindex.html

而你希望它是:rootDirectory/index.html