Saya mengalami masalah dengan variabel (config) yang dideklarasikan dalam file template giok (index.jade) yang tidak diteruskan ke file javascript, yang kemudian membuat javascript saya macet. Ini file (views / index.jade):
h1 #{title}
script(src='./socket.io/socket.io.js')
script(type='text/javascript')
var config = {};
config.address = '#{address}';
config.port = '#{port}';
script(src='./javascripts/app.js')
Berikut adalah bagian dari app.js saya (sisi server):
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.configure('development', function(){
app.set('address', 'localhost');
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use(express.errorHandler());
});
// Routes
app.get('/', function(req, res){
res.render('index', {
address: app.settings.address,
port: app.settings.port
});
});
if (!module.parent) {
app.listen(app.settings.port);
console.log("Server listening on port %d",
app.settings.port);
}
// Start my Socket.io app and pass in the socket
require('./socketapp').start(io.listen(app));
Dan berikut ini adalah bagian dari file javascript saya yang rusak (public / javascripts / app.js):
(function() {
var socket = new io.Socket(config.address, {port: config.port, rememberTransport: false});
Saya menjalankan situs dalam mode pengembangan (NODE_ENV = pengembangan) di localhost (mesin saya sendiri). Saya menggunakan node-inspector untuk debugging, yang memberi tahu saya bahwa variabel config tidak ditentukan di public / javascripts / app.js.
Ada ide ?? Terima kasih!!
javascript
node.js
pug
Michael Eilers Smith
sumber
sumber
Jawaban:
Ini agak terlambat tapi ...
Ini berfungsi dengan baik di skrip saya. Di Express, saya melakukan ini:
Saya kira giok terbaru berbeda?
Merc.
edit: ditambahkan "." setelah skrip untuk mencegah peringatan Jade.
sumber
!{}
adalah untuk interpolasi kode yang tidak lolos , yang lebih cocok untuk objekIdenya adalah untuk mencegah penyerang untuk:
JSON.stringify
keluar dari tanda kutip</script>
string, pernyataan ganti akan menanganinyahttps://github.com/pugjs/pug/blob/355d3dae/examples/dynamicscript.pug
#{}
adalah untuk interpolasi string yang lolos , yang hanya cocok jika Anda bekerja dengan string. Itu tidak bekerja dengan objeksumber
JSON
objek global? Sepertinya berfungsi tanpa mengimpor perpustakaan lain. Jika ya, bagaimana dengan dukungan browser?replace
panggilan dalam kode ini, dan memperlakukan nilai ini sama seperti input lainnya. JSON.stringify dijamin menghasilkan javascript yang valid (atau gagal), dan setelah Anda memiliki nilai yang berpotensi berbahaya ini di memori, Anda dapat memastikan untuk membersihkannya sesuai kebutuhan sebelum digunakan.Dalam kasus saya, saya mencoba untuk mengirimkan objek ke template melalui rute ekspres (mirip dengan pengaturan OP). Kemudian saya ingin meneruskan objek itu ke dalam fungsi yang saya panggil melalui tag skrip di template pug. Meskipun jawaban lagginreflex membuat saya dekat, saya berakhir dengan yang berikut:
Ini memastikan objek diteruskan seperti yang diharapkan, daripada perlu deserialisasi dalam fungsinya. Juga, jawaban lain tampaknya berfungsi dengan baik dengan primitif, tetapi ketika array dll diteruskan bersama dengan objek mereka diurai sebagai nilai string.
sumber
Jika Anda seperti saya dan Anda sering menggunakan metode penerusan variabel ini, berikut adalah solusi kode tanpa penulisan.
Di rute node.js Anda, teruskan variabel dalam objek yang disebut
window
, seperti ini:Kemudian di file layout pug / jade Anda (tepat sebelum
block content
), Anda mengeluarkannya seperti ini:Karena file layout.pug saya dimuat dengan setiap file pug, saya tidak perlu 'mengimpor' variabel saya berulang kali.
Dengan cara ini semua variabel / objek yang diteruskan ke
window
'secara ajaib' berakhir diwindow
objek sebenarnya dari browser Anda di mana Anda dapat menggunakannya di Reactjs, Angular, ... atau vanilla javascript.sumber
Begini cara saya membahas ini (menggunakan turunan MEAN)
Variabel saya:
Pertama, saya harus memastikan bahwa variabel config yang diperlukan telah diteruskan. MEAN menggunakan paket node nconf, dan secara default diatur untuk membatasi variabel mana yang diteruskan dari lingkungan. Saya harus memperbaikinya:
config / config.js:
asli:
setelah modifikasi:
Sekarang saya dapat mengatur variabel saya seperti ini:
Catatan: Saya menyetel ulang "indikator heirarki" menjadi "__" (garis bawah ganda) karena defaultnya adalah ":", yang membuat variabel lebih sulit disetel dari bash. Lihat posting lain di utas ini.
Sekarang bagian giok: Selanjutnya nilai-nilai perlu dirender, sehingga javascript dapat mengambilnya di sisi klien. Cara mudah untuk menulis nilai ini ke file indeks. Karena ini adalah aplikasi satu halaman (bersudut), halaman ini selalu dimuat terlebih dahulu. Saya pikir idealnya ini harus berupa file penyertaan javascript (hanya untuk menjaga kebersihan), tetapi ini bagus untuk demo.
app / controllers / index.js:
app / views / index.jade:
Di html yang saya berikan, ini memberi saya skrip kecil yang bagus:
Dari titik ini, mudah bagi sudut untuk menggunakan kode tersebut.
sumber
Lihat pertanyaan ini: JADE + EXPRESS: Iterasi objek dalam kode JS sebaris (sisi klien)?
Saya mempunyai masalah yang sama. Jade tidak meneruskan variabel lokal di (atau melakukan template sama sekali) ke skrip javascript, Jade hanya meneruskan seluruh blok sebagai teks literal. Jika Anda menggunakan 'alamat' variabel lokal dan 'port' di file Jade Anda di atas tag skrip, variabel tersebut akan muncul.
Solusi yang memungkinkan tercantum dalam pertanyaan yang saya tautkan di atas, tetapi Anda dapat: - meneruskan setiap baris sebagai teks yang tidak lolos (! = Di awal setiap baris), dan cukup letakkan "-" sebelum setiap baris javascript yang menggunakan variabel lokal, atau: - Meneruskan variabel melalui elemen dom dan mengakses melalui JQuery (jelek)
Apakah tidak ada cara yang lebih baik? Sepertinya pembuat Jade tidak menginginkan dukungan multiline javascript, seperti yang ditunjukkan oleh utas ini di GitHub: https://github.com/visionmedia/jade/pull/405
sumber