node.js TypeError: yol mutlak olmalı veya res.sendFile için kök belirtmelidir [JSON ayrıştırılamadı]


152

[ekle] Yani benim sonraki sorun ben yeni bir bağımlılık (npm install --save socket.io) eklemeye çalıştığınızda olmasıdır. JSON dosyası da geçerlidir. Bu hatayı alıyorum: json ayrıştırılamadı

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 

Bu hatanın neden geri döndüğünü anlamaya çalışıyorum. Tüm dosyalar (HTML, JSON, JS) masaüstümdeki aynı klasörün içinde. Node.js ve socket.io kullanıyorum

Bu benim JS dosyam:

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');
});

İade edilen budur:

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)

Yanıtlar:


331

Hata oldukça açıktır, mutlak (göreli yerine) bir yol belirtmeniz ve / veya rootyapılandırma nesnesinde ayarlamanız gerekir res.sendFile(). Örnekler:

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

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

veya bir kök belirtin (ilk bağımsız değişken için temel yol olarak kullanılır res.sendFile():

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

rootYolun belirtilmesi, potansiyel olarak hatalı biçimlendirilmiş / kötü amaçlı parçalar içerebilecek ..(örn. ../../../../../../etc/passwd) Kullanıcı tarafından oluşturulan bir dosya yolundan geçtiğinizde daha kullanışlıdır . rootYolun ayarlanması, söz konusu kötü amaçlı yolların bu temel yolun dışındaki dosyalara erişmek için kullanılmasını önler.


1
nasıl bir dir olarak kök belirtmek için en iyi yolu nedir?
SuperUberDuper

1
@SuperUberDuper Şunu mu demek istediniz path.resolve(__dirname, '.../public')? Bu, komut dosyasının üst dizininin 'genel' alt dizinine çözümlenecektir.
mscdex

güzel! bu gelecekte bu değeri __dirname içinde kalıcı olarak saklıyor mu?
SuperUberDuper

1
Merhaba, aşağıdaki res.sendFile (path.resolve (__ dirname + '/index.html', '../')) denedim ama mesaj alamıyorum:
SuperUberDuper

2
@SuperUberDuper <- bu adam haklıydı (en azından benim için). Yazım ../../<etc>sözdizimi ile gezinmenize izin veren yolları normalleştiren çözüm işlevini kullanıyor . Arasındaki virgül dikkat edin __dirnameve ../public. + İşaretini kullanmak işe yaramıyor.
Helzgate

20

Kök yolu eklemeyi deneyin.

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

12

.mjs dosyalarında şimdilik şimdilik __dirname yok

bundan dolayı

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

Gereksinimim __dirname yolunu aldıktan sonra geri dönmek olduğu için benim için iyi bir çözüm. Res.sendFile ('index.html', {root: './public/views'});
nilakantha singh deo

el çubuklarındaki SITEMAP.XML için bu doğru çözümdür. Çok teşekkür ederim
titoih

3

Yola güveniyorsanız, path.resolve bir seçenektir:

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'));
    });

3

Hata oldukça basittir. Muhtemelen nedeni index.html dosyanızın kök dizinde olmamasıdır.

Veya kök dizinde bulunuyorsa, göreli başvuru çalışmaz.

Bu nedenle sunucuya dosyanızın tam yerini söylemeniz gerekir. Bu, NodeJ'lerde dirname yöntemi kullanılarak yapılabilir. Kodunuzu bununla değiştirin:

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

Ana sayfanızdan önce eğik çizgi "/" sembolünü eklediğinizden emin olun. Aksi takdirde yolunuz şu şekilde olur: rootDirectoryindex.html

Halbuki olmasını istersiniz: rootDirectory / index.html


1

Bu yolu değişken kullanarak çözer. Örnek kod aşağıdaki gibi görünecektir.

var path = require("path");

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

0

Kök Dizin üzerinde çalışıyorsanız, bu yaklaşımı kullanabilirsiniz

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

ancak bir klasörün içindeki Routes kullanıyorsanız diyelim ki /Routes/someRoute.jsböyle bir şey yapmanız gerekecek

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

0

Simgeye göreceli yolu olan Daktilo Yazısı'nda:

import path from 'path';

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

0

Localhost: 8080 çağrısında index.html'ye yönlendirir.

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

0

Aşağıdaki kodu kullandım ve sitemap.xml dosyasını göstermeye çalıştım

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

-1

Bu başka bir şekilde çözülebilir:

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

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

});

process.env.PWD işlem başlangıcında çalışma dizinini başlatacaktır.


-2

Bunu yaptım ve şimdi uygulamam düzgün çalışıyor,

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

Dosyanın konumunu kodlamak kötü bir uygulamadır. Uygulamayı farklı bir makineye dağıtırsanız, dosyanın yolu büyük olasılıkla farklı olacaktır
Merve Sahin

-3

Dizininizde çift eğik çizgi kullanmayı düşünebilirsiniz;

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.