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

时间:2014-09-27 22:02:30

标签: javascript json node.js socket.io dependencies

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

14 个答案:

答案 0 :(得分:269)

错误很明显,您需要在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路径可防止此类恶意路径被用于访问该基本路径之外的文件。

答案 1 :(得分:15)

尝试添加根路径。

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

答案 2 :(得分:9)

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

因此

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

因此,您需要告诉服务器文件的确切位置。 这可以通过在NodeJ中使用dirname方法来完成。 只需用以下代码替换您的代码:

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

确保添加斜杠&#34; /&#34;主页前的符号。否则您的路径将变为:rootDirectoryindex.html

您希望它是:rootDirectory / index.html

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

我通过使用path变量解决了这个问题。示例代码如下所示。

var path = require("path");

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

答案 7 :(得分:0)

如果您正在使用“根目录”,则可以使用这种方法

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

但是如果您使用的是文件夹内的Routes,请说/Routes/someRoute.js,那么您将需要执行类似的操作

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

答案 8 :(得分:0)

在Typescript中,图标的相对路径为:

import path from 'path';

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

答案 9 :(得分:0)

它将通过localhost:8080调用重定向到index.html。

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

答案 10 :(得分:0)

app.js中的此配置对我来说效果很好:

http://www.page.com/

Rewritten: http://www.page.com/drill/


http://www.page.com/storage

Rewritten: http://www.page.com/drill/storage

答案 11 :(得分:-1)

这可以通过其他方式解决:

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

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

});

process.env.PWD将在流程启动时添加工作目录。

答案 12 :(得分:-1)

您可以考虑在目录中使用双斜杠,例如

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

答案 13 :(得分:-2)

我这样做了,现在我的应用可以正常工作了,

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