Jika saya melakukan
res.sendfile('public/index1.html');
maka saya mendapatkan peringatan konsol server
express usang
res.sendfile
: Gunakanres.sendFile
saja
tetapi bekerja dengan baik di sisi klien.
Tetapi ketika saya mengubahnya ke
res.sendFile('public/index1.html');
Saya mendapatkan kesalahan
TypeError: path harus absolut atau tentukan root
res.sendFile
dan index1.html
tidak dirender.
Saya tidak dapat menemukan apa jalan absolut itu. Saya memiliki public
direktori pada level yang sama dengan server.js
. Saya melakukan res.sendFile
dari dengan server.js
. Saya juga sudah menyatakanapp.use(express.static(path.join(__dirname, 'public')));
Menambahkan struktur direktori saya:
/Users/sj/test/
....app/
........models/
....public/
........index1.html
Apa jalur absolut yang harus ditentukan di sini?
Saya menggunakan Express 4.x.
express.static
middleware untuk melayani direktori publik Anda, mengapa Anda harusres.sendFile
mengirimpublic/index1.html
?res.sendFile
dari dalamapp.get('/', function(req, res){res.sendFile("...")})
untuk mengirimkannya atas permintaan.Jawaban:
The
express.static
middleware terpisah darires.sendFile
, sehingga menginisialisasi dengan path absolut untuk Andapublic
direktori tidak akan melakukan apapun untukres.sendFile
. Anda harus menggunakan jalur absolut secara langsungres.sendFile
. Ada dua cara sederhana untuk melakukannya:res.sendFile(path.join(__dirname, '../public', 'index1.html'));
res.sendFile('index1.html', { root: path.join(__dirname, '../public') });
Catatan:
__dirname
mengembalikan direktori tempat skrip yang saat ini dijalankan. Dalam kasus Anda, sepertinyaserver.js
ada diapp/
. Jadi, untuk mendapatkanpublic
, Anda harus kembali keluar satu tingkat pertama:../public/index1.html
.Catatan:
path
adalah modul bawaan yang perlurequire
d agar kode di atas berfungsi:var path = require('path');
sumber
res.sendFile('../public/index.html', {root: __dirname});
juga berfungsi dan lebih pendekconsole.log(path.join(__dirname, '../public', 'index.html'));
tetapires.sendFile(path.join(__dirname, '../public', 'index.html'));
hanya bekerja denganvar path = require('path');
res.sendFile('../public/index.html', {root: __dirname});
tidak berfungsi (lagi), karena mengembalikan 403 Forbidden karena pergi di atas root. Lakukanres.sendFile('public/index.html', {root: path.dirname(__dirname)});
sebaliknya.Coba saja ini sebagai gantinya:
Ini berhasil untuk saya. root: __ dirname akan mengambil alamat di mana server.js berada dalam contoh di atas dan kemudian untuk menuju ke index1.html (dalam hal ini) jalur yang dikembalikan adalah untuk menuju ke direktori di mana folder publik berada.
sumber
di mana
__dirname
akan mengelola nama direktori tempat skrip saat ini (server.js
) berada.sumber
path
membuatnya os-independent.Alternatif yang belum terdaftar yang berfungsi untuk saya hanyalah menggunakan
path.resolve
dengan string terpisah atau hanya satu dengan keseluruhan path:Atau
(Node v6.10.0)
Ide bersumber dari https://stackoverflow.com/a/14594282/6189078
sumber
Berdasarkan jawaban lain, ini adalah contoh sederhana tentang bagaimana memenuhi persyaratan yang paling umum:
Ini juga berfungsi sebagai cara sederhana untuk merespons dengan index.html pada setiap permintaan , karena saya menggunakan bintang
*
untuk menangkap semua file yang tidak ditemukan di direktori statis (publik) Anda; yang merupakan kasus penggunaan paling umum untuk aplikasi web. Ubah ke/
untuk mengembalikan indeks hanya di jalur root.sumber
Saya mencoba ini dan itu berhasil.
sumber
process.cwd()
mengembalikan jalur absolut dari proyek Anda.Kemudian :
sumber
Cara lain untuk melakukan ini dengan menulis lebih sedikit kode.
sumber
Anda dapat menggunakan send bukannya sendFile sehingga Anda tidak akan menghadapi kesalahan! ini berfungsi akan membantu Anda!
untuk memberi tahu peramban bahwa respons Anda adalah jenis PDF
jika Anda ingin file itu langsung terbuka di halaman yang sama setelah pengguna mengunduhnya, tulis 'inline' sebagai gantinya lampiran dalam kode di atas.
sumber
Jika Anda ingin mengatur ini sekali dan menggunakannya di mana-mana, cukup konfigurasikan middleware Anda sendiri. Saat Anda menyiapkan aplikasi Anda, gunakan yang berikut untuk menentukan fungsi baru pada objek respons:
Kemudian gunakan sebagai berikut:
sumber
Saya menggunakan Node.Js dan memiliki masalah yang sama ... Saya memecahkan hanya menambahkan '/' di awal setiap skrip dan tautan ke file statis css.
Sebelum:
Setelah:
sumber