Saya punya kode ini:
res.sendfile( '../../temp/index.html' )
Namun, ini melempar kesalahan ini:
Error: Forbidden
at SendStream.error (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:145:16)
at SendStream.pipe (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:307:39)
at ServerResponse.res.sendfile (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:339:8)
at exports.boot (/Users/Oliver/Development/Personal/Reader/server/config/routes.js:18:9)
at callbacks (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:161:37)
at param (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:135:11)
at pass (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:170:5)
at Object.router (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:33:10)
at next (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/proto.js:199:15)
Adakah yang bisa memberi tahu saya mengapa ini terjadi?
res.sendfile
path.resolve
harus melakukan apa yang Anda butuhkan.Jawaban:
Saya percaya itu karena jalur relatif; "../" dianggap berbahaya. Selesaikan jalur lokal terlebih dahulu, lalu panggil
res.sendfile
. Anda dapat menyelesaikan jalur denganpath.resolve
sebelumnya.sumber
sendfile
sebagai buruk. Kecuali Anda menentukanroot
parameter direktori, seperti yang terlihat di sini: github.com/visionmedia/express/issues/1465const
lebih disukai daripadavar
Jawaban ini mengumpulkan info dari jawaban / komentar lainnya.
Itu tergantung apakah Anda ingin memasukkan sesuatu yang relatif ke direktori kerja proses (cwd) atau direktori file. Keduanya menggunakan
path.resolve
fungsi (diletakkanvar path = require('path')
di bagian atas file.path.resolve('../../some/path/to/file.txt');
path.resolve(__dirname+'../../some/path/to/file.txt');
Dari membaca tautan dari komentar @ Joe, sepertinya jalur relatif adalah risiko keamanan jika Anda menerima input pengguna untuk jalur tersebut (mis.
sendfile('../.ssh/id_rsa')
Mungkin percobaan pertama peretas).sumber
The dokumentasi Ekspres menyarankan melakukannya dengan cara yang berbeda, dan menurut saya itu lebih masuk akal kemudian daripada solusi saat ini.
res.sendFile('index.html', {root: './temp'});
Opsi root tampaknya ditetapkan
./
sebagai direktori root proyek Anda. Jadi saya tidak bisa sepenuhnya tahu di mana file Anda terkait dengan root proyek, tetapi jika folder temp Anda ada di sana, Anda dapat mengatur./temp
sebagai root untuk file yang Anda kirim.sumber
.sendfile
tetapi karena ia bergantung pada sesuatu yang lain sepenuhnya (jalan). Terima kasih telah menunjukkan ini.