node.js TypeError:路径必须是绝对路径或指定根路径到res.sendFile[解析JSON失败]

< p >(添加) 所以我的下一个问题是,当我尝试添加一个新的依赖(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)
245629 次浏览

尝试添加根路径。

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

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

// 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路径可以防止这样的恶意路径被用来访问该基本路径之外的文件。

如果你信任路径,路径。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

这可以用另一种方式解决:

app.get("/", function(req, res){


res.send(`${process.env.PWD}/index.html`)


});

process.env.PWD将在进程启动时位于工作目录的前面。

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

因此

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

你可以考虑在你的目录上使用双斜杠

app.get('/',(req,res)=>{
res.sendFile('C:\\Users\\DOREEN\\Desktop\\Fitness Finder' + '/index.html')
})

我用路径变量来解决这个问题。示例代码如下所示。

var path = require("path");


app.get('/', (req, res) => {
res.sendFile(path.join(__dirname + '/index.html'));
})

如果您正在使用根目录,那么您可以使用这种方法

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

但如果你使用的是一个文件夹中的路由,比如/Routes/someRoute.js,那么你需要做这样的事情

const path = require("path");
...
route.get("/some_route", (req, res) => {
res.sendFile(path.resolve('FOLDER_IN_ROOT_DIRECTORY/index.html')
});


在Typescript中使用图标的相对路径:

import path from 'path';


route.get('/favicon.ico', (_req, res) => res.sendFile(path.join(__dirname, '../static/myicon.png')));

它将在localhost:8080调用上重定向到index.html。

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

我这样做了,现在我的应用程序正常工作了,

res.sendFile('your drive://your_subfolders//file.html');

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

router.get('/sitemap.xml', function (req, res) {
res.sendFile('sitemap.xml', { root: '.' });
});

在app.js中的配置对我来说很好:

    //production mode
if (process.env.NODE_ENV === "production") {
app.use(express.static(path.join(__dirname, "client/build")));
app.get("*", (req, res) => {
res.sendFile(path.join((__dirname + "/client/build/index.html")));


});
}


//build mode
app.get("*", (req, res) => {
res.sendFile(path.join(__dirname + "/client/public/index.html"));


});

不幸的是,在ES6中,要访问绝对路径__dir_name,你必须在所有地方输入以下代码:

import { dirname } from 'path';
import { fileURLToPath } from 'url'


const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

或者用你想要使用的函数创建一个path.js:

import { join, dirname } from 'path';
import { fileURLToPath } from 'url'


const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);


export { __dirname, join };

And import before using: import { join, __dirname } from './path.js'; < / p >