Jsrender: Bagaimana cara menangani pengecualian kesalahan JsRender selama kompilasi atau rendering sisi server?

Dibuat pada 23 Mar 2016  ·  14Komentar  ·  Sumber: BorisMoore/jsrender

Hai,
Saya memiliki struktur berikut (lupakan ekstensi ranting, kiri dari tes nunjucks saya):

            var appData ={};
            res.render('layout', appData, function(err, html) {
               res.send(html);
            });
{{include tmpl='./_includes/footer.html'}} 
//if i remove the import, the template get rendered and shows 'test'

Saya tidak mendapatkan kesalahan, hanya halaman putih.

Cara menerapkan ini di server:

        $.views.settings.debugMode(true);

Apakah ini benar :

jsrender.views.settings.debugMode(true)

Tolong apa yang hilang?

Komentar yang paling membantu

Jalur "./..." adalah jalur relatif - jalur tersebut relatif terhadap skrip panggilan - dalam kasus Anda app.js. Mereka tidak ada hubungannya dengan Express.

Anda perlu menulis {{include tmpl='./templates/test.html' /}}

OTOH jika Anda menggunakan Hapi atau Express, Anda dapat menentukan lokasi direktori templates, dan kemudian menulis res.render('_includes/footer', ... di mana Anda menggunakan Express API - maka jalurnya relatif terhadap folder templates yang Anda atur untuk Express, dan Anda menghilangkan ekstensi .html, karena Anda juga mengaturnya untuk express.

Jalur JsRender './...' bekerja dengan baik baik Anda menggunakan Express, Hapi, atau tidak keduanya.

Semua yang ditampilkan dalam sampel di sini https://github.com/BorisMoore/jsrender-node-starter , dan dokumen di sini http://www.jsviews.com/#node/filetmpls.

Apakah Anda mulai dari sampel itu? Jika demikian, Anda seharusnya memulai dari jalur relatif ./... yang benar...

Semua 14 komentar

Kesalahan yang Anda miliki adalah kesalahan sintaks:

{{include tmpl='./_includes/footer.html'}} (Tidak ada garis miring penutup)

seharusnya

{{include tmpl='./_includes/footer.html' /}}

Saat berjalan di Node, jika JsRender melempar, Node akan menangkap pengecualian dan meneruskannya ke panggilan balik render Anda, dan Anda harus menanganinya di sana.

res.render('layout', appData, function(err, html) {
    res.send(html);
}); callback:

Misalnya Anda dapat membuatnya membuat kesalahan dengan menulis:

res.render(..., function(err, html) {
    res.send(err ? jsrender.views.converters.html(err.message) : html); // HTML encode message
});

Anda juga dapat menjalankan node dalam mode debug, dan menangkap kesalahan dengan breakpoints. (Menggunakan node-debug ...)

Ya, pengaturan untuk debugMode(true) adalah jsrender.views.settings.debugMode(true); - dan itu akan berfungsi untuk merender kesalahan rendering apa pun - alih-alih membuang pengecualian. Tetapi kesalahan sintaks dalam template akan tetap muncul, karena terjadi selama kompilasi template, bukan selama rendering...

Saya mengubah judul masalah ini, agar sesuai dengan skenario yang kita bahas di sini.

Saya sekarang telah menambahkan errorhandler ke aplikasi Express saya seperti ini:

        app.use('development', function(){
            app.use(errorhandler());
        });

Saya akan mendokumentasikan pengalaman saya di sini untuk siapa pun di masa depan..

–––
Saya mendapatkan Kesalahan sekarang!

{Error: ENOENT: no such file or directory, open './_includes/footer.html'}
"start": " tsc -w & export NODE_ENV=development nodemon & app.js"

console.log('env:',process.env.NODE_ENV); // env: development

Saya mencoba menghapus titik jalur tetapi kemudian saya mendapatkan:

test _includes/footer.html

Itu adalah konfigurasi pandangan saya:

app.set('views', __dirname + '/app'); 
console.log('js views debug mode: ', jsrender.views.settings.debugMode() ); // returns true

Aneh,

Ini dengan benar membuat footer:

res.render('_includes/footer', appData, function(err, html) {
                res.send(err ? jsrender.views.converters.html(err.message) : html); 
            });

Jika saya memasukkan footer ke dalam tata letak seperti ini:

{{include tmpl='_includes/footer' /}}

Saya baru saja menampilkan yang berikut ini:

_includes/footer

Saya membuat proyek pengujian sederhana di sini untuk menguji include :

di sini

Tetapi alih-alih merender file yang disertakan, itu hanya menampilkan include filename ?

Jalur "./..." adalah jalur relatif - jalur tersebut relatif terhadap skrip panggilan - dalam kasus Anda app.js. Mereka tidak ada hubungannya dengan Express.

Anda perlu menulis {{include tmpl='./templates/test.html' /}}

OTOH jika Anda menggunakan Hapi atau Express, Anda dapat menentukan lokasi direktori templates, dan kemudian menulis res.render('_includes/footer', ... di mana Anda menggunakan Express API - maka jalurnya relatif terhadap folder templates yang Anda atur untuk Express, dan Anda menghilangkan ekstensi .html, karena Anda juga mengaturnya untuk express.

Jalur JsRender './...' bekerja dengan baik baik Anda menggunakan Express, Hapi, atau tidak keduanya.

Semua yang ditampilkan dalam sampel di sini https://github.com/BorisMoore/jsrender-node-starter , dan dokumen di sini http://www.jsviews.com/#node/filetmpls.

Apakah Anda mulai dari sampel itu? Jika demikian, Anda seharusnya memulai dari jalur relatif ./... yang benar...

Terima kasih yang bekerja!

Saya mempelajari /jsrender-node-starter, tetapi tidak jelas bagi saya bahwa ini relatif terhadap skrip panggilan dan saya tidak ingat bahwa saya membacanya di manual. Itu hanya mengatakan bahwa itu relatif tetapi tidak dari skrip panggilan. Tapi sekarang sudah jelas!

Benar - itu tidak menjelaskan skrip panggilan, tetapi sebenarnya itu standar untuk node, jalurnya hanya digunakan dengan semantik standar. Saat baru mengenal node terkadang membingungkan. Tetapi contoh di dokumen menunjukkan ./templates/... jadi sarankan bahwa Origin lebih tinggi daripada folder template (jika ada yang ditetapkan).

Saya berasumsi (salah) bahwa setelah mendaftarkannya sebagai View Engine, impor berperilaku sebagai Express.

Terima kasih Boris!

Tentu!

Apakah ada cara untuk mendapatkan kesalahan untuk kesalahan sintaks?

Sejauh menyangkut JsRender, jika mendeteksi kesalahan sintaks, itu melempar pengecualian kesalahan yang sesuai.

Apa yang terjadi pada eksepsi terserah Anda, dan lingkungan tempat Anda menjalankan. Anda dapat menulis ke konsol atau merender ke browser, sesuai keinginan - dengan menyiapkan penangan kesalahan yang sesuai untuk menangkap kesalahan dan melakukannya.

Jika yang Anda maksud adalah server di Express, baik sekali lagi, terserah Anda untuk menangkap kesalahan, atau mengatur penanganan kesalahan yang Anda inginkan, atau menggunakan middleware lain yang tersedia, dll. http://expressjs.com/en/guide/ penanganan kesalahan.html.

Jika Anda telah mengatur debugMode(true) atau serupa, maka jika kesalahan itu selama rendering, JsRender tidak akan membuang, tetapi akan menyertakan pesan kesalahan dalam output. Sebaiknya pertahankan debugMode ke false, jika Anda ingin menangkap pengecualian. Kemudian Anda dapat menggunakan Express standar tanpa middleware tambahan, dan menulis, misalnya:

app.get('/', function(req, res) { // Express template
  res.render('layout-movies', appData, function(err, html) {
    if (err) {
      console.log("Error: " + err.message);
    }
    res.send(html)
  });
});


Terima kasih dan Happy Eastern :dancers:

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ba1dr picture ba1dr  ·  7Komentar

kojilab picture kojilab  ·  3Komentar

konijn picture konijn  ·  3Komentar

AaronAcerboni picture AaronAcerboni  ·  3Komentar

ghost picture ghost  ·  3Komentar