res.sendFile mutlak yolu


137

Eğer bir

res.sendfile('public/index1.html'); 

bir sunucu konsolu uyarısı alıyorum

ekspres kullanımdan kaldırıldı res.sendfile: res.sendFileBunun yerine kullanın

ancak istemci tarafında iyi çalışıyor.

Ama bunu

res.sendFile('public/index1.html');

Bir hata alıyorum

TypeError: yol mutlak olmalı veya res.sendFile

ve index1.htmlişlenmez.

Mutlak yolun ne olduğunu bulamıyorum. publicİle aynı düzeyde dizin var server.js. Ben yapıyorum res.sendFileile gelen server.js. Ben de beyan ettimapp.use(express.static(path.join(__dirname, 'public')));

Dizin yapımı ekliyor:

/Users/sj/test/
....app/
........models/
....public/
........index1.html

Burada belirtilecek mutlak yol nedir?

Express 4.x kullanıyorum.


express.staticOrtak dizininizi sunmak için ara katman yazılımını kullanıyorsanız , neden res.sendFilegöndermeniz gerekiyor public/index1.html?
Mike S

1
Ben telefon res.sendFileiçinden app.get('/', function(req, res){res.sendFile("...")})talep üzerine göndermek.
Kaya Toast

Yanıtlar:


311

Ara express.statickatman yazılımı ayrıdır res.sendFile, bu nedenle publicdizininize mutlak bir yolla başlatmak hiçbir şey yapmaz res.sendFile. Doğrudan ile mutlak bir yol kullanmanız gerekir res.sendFile. Bunu yapmanın iki basit yolu vardır:

  1. res.sendFile(path.join(__dirname, '../public', 'index1.html'));
  2. res.sendFile('index1.html', { root: path.join(__dirname, '../public') });

Not: __dirname Şu anda yürütülen komut olduğunu dizin döndürdüğünü durumda, benziyor. server.jsİçindedir app/. Yani, almak için public, önce bir seviye geri gerekir: ../public/index1.html.

Not: yukarıdaki kodun çalışması için d olması gereken pathyerleşik bir modüldürrequire :var path = require('path');


14
res.sendFile('../public/index.html', {root: __dirname});ayrıca çalışıyor ve daha kısa
Fabien Sa

Express ve webstorm ide ile çalışma: hata console.log(path.join(__dirname, '../public', 'index.html'));res.sendFile(path.join(__dirname, '../public', 'index.html'));var path = require('path');
yapmadım

SendFile içinde kullanılabilmesi için mutlak yolu önceden tanımlamanın bir yolu yok mu?
eran otzap

4
res.sendFile('../public/index.html', {root: __dirname});(artık) çalışmıyor, çünkü 403 Kökün üstüne çıktığı için yasak. Bunun res.sendFile('public/index.html', {root: path.dirname(__dirname)});yerine yapın.
Trevor Robinson

48

Bunun yerine şunu deneyin:

res.sendFile('public/index1.html' , { root : __dirname});

Bu benim için çalıştı. root: __ dirname, yukarıdaki örnekte server.js'nin bulunduğu adresi alır ve sonra index1.html'ye (bu örnekte) ulaşmak için döndürülen yol, ortak klasörün bulunduğu dizine ulaşmaktır.


Bu seçenek neden belgelenmiyor?
timkay

9
res.sendFile( __dirname + "/public/" + "index1.html" );

burada __dirnameyürütülmekte olan komut dosyasının ( server.js) bulunduğu dizinin adını yönetir .


Bu çözüm oldukça basitti Yardım için teşekkürler .. İnsanların neden aynı şeyi yapmak için 'path' paketini kullanmasını önerdiğini merak ediyorum.
Üçüncü

3
@ Sanırım, kullanmak pathos-bağımsız yapar.
kmonsoor

7

Benim için işe yarayan, henüz listelenmemiş bir alternatif, sadece path.resolveayrı dizelerle veya sadece tüm yolla kullanılan bir alternatiftir :

// comma separated
app.get('/', function(req, res) {
    res.sendFile( path.resolve('src', 'app', 'index.html') );
});

Veya

// just one string with the path
app.get('/', function(req, res) {
    res.sendFile( path.resolve('src/app/index.html') );
});

(Düğüm v6.10.0)

Fikir https://stackoverflow.com/a/14594282/6189078 adresinden alınmıştır.


6

Diğer cevaplara dayanarak, bu en yaygın gereksinimin nasıl yerine getirileceğine basit bir örnektir:

const app = express()
app.use(express.static('public')) // relative path of client-side code
app.get('*', function(req, res) {
    res.sendFile('index.html', { root: __dirname })
})
app.listen(process.env.PORT)

Statik (genel) dizininizde bulunmayan tüm dosyaları yakalamak için bir yıldız kullandığım için bu, her istekte index.html ile yanıt vermenin basit bir yolu olarak da ikiye katlanır *; web uygulamaları için en yaygın kullanım durumudur. /Dizini yalnızca kök yolunda döndürmek için değiştirin .


Güzel. Güzel ve özlü.
lharby

5

Bunu denedim ve işe yaradı.

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

4

process.cwd() projenizin mutlak yolunu döndürür.

Sonra :

res.sendFile( `${process.cwd()}/public/index1.html` );

3

Bunu daha az kod yazmanın başka bir yolu.

app.use(express.static('public'));

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

5
Bu "TypeError: yol mutlak olmalı veya res.sendFile için kök belirtmelidir" oluşturur
GreenAsJade

1

sendFile yerine send'i kullanabilirsiniz, böylece hatayla yüzleşmeyeceksiniz! bu işler size yardımcı olacak!

fs.readFile('public/index1.html',(err,data)=>{
if(err){
  consol.log(err);
}else {
res.setHeader('Content-Type', 'application/pdf');

tarayıcıya yanıtınızın PDF türü olduğunu söylemek için

res.setHeader('Content-Disposition', 'attachment; filename='your_file_name_for_client.pdf');

kullanıcının dosyayı indirdikten hemen sonra aynı sayfada açılmasını istiyorsanız. yukarıdaki kodda ek yerine 'satır içi' yazın.

res.send(data)

0

Bunu bir kez ayarlamak ve her yerde kullanmak istiyorsanız, sadece kendi ara yazılımınızı yapılandırın. Uygulamanızı ayarlarken, yanıt nesnesinde yeni bir işlev tanımlamak için aşağıdakileri kullanın:

app.use((req, res, next) => {
  res.show = (name) => {
    res.sendFile(`/public/${name}`, {root: __dirname});
  };
  next();
});

Sonra aşağıdaki gibi kullanın:

app.get('/demo', (req, res) => {
  res.show("index1.html");
});

0

Node.Js kullanın ve aynı sorunu vardı ... Ben sadece bir betiğin başlangıcında bir '/' ekleyerek çözüldü ve bir css statik dosyaya bağlantı.

Önce:

<link rel="stylesheet" href="assets/css/bootstrap/bootstrap.min.css">

Sonra:

<link rel="stylesheet" href="/assets/css/bootstrap/bootstrap.min.css">

Bunun çalışması için ekspres statik sunucuyu
kurmanız gerekir
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.