Rumah > Artikel > hujung hadapan web > Penjelasan terperinci mengenai penggunaan Express.JS_node.js
Selepas memasang nod (muat turun), buat direktori pada mesin anda dan mulakan aplikasi pertama anda.
$ mkdir hello-world
Dalam direktori ini anda akan mentakrifkan "pakej" aplikasi, yang tidak berbeza daripada mana-mana pakej nod lain. Fail json dalam direktori fail dengan jelas mentakrifkan kebergantungan. Anda boleh menggunakan arahan npm untuk mendapatkan versi terkini ekspres, mengikut mana-mana yang anda suka, dan bukannya memasang versi selain daripada "3.x" untuk mengelakkan sebarang kejutan yang tidak diketahui.
{ "name": "hello-world", "description": "hello world test app", "version": "0.0.1", "private": true, "dependencies": { "express": "3.x" } }
Kini, anda mempunyai pakej. json fail dalam direktori ini anda boleh menggunakan npm(1) untuk memasang kebergantungan ini, dalam kes ini hanya taip:
$ npm install
Setelah npm selesai, anda akan mempunyai kebergantungan Express 3.x dalam direktori /node_modules. Anda boleh mengesahkan ini dengan npm ls, kerana coretan berikut menunjukkan pepohon Express dan kebergantungannya sendiri.
$ npm ls hello-world@0.0.1 /private/tmp └─┬ express@3.0.0beta7 ├── commander@0.6.1 ├─┬ connect@2.3.9 │ ├── bytes@0.1.0 │ ├── cookie@0.0.4 │ ├── crc@0.2.0 │ ├── formidable@1.0.11 │ └── qs@0.4.2 ├── cookie@0.0.3 ├── debug@0.7.0 ├── fresh@0.1.0 ├── methods@0.0.1 ├── mkdirp@0.3.3 ├── range-parser@0.0.4 ├─┬ response-send@0.0.1 │ └── crc@0.2.0 └─┬ send@0.0.3 └── mime@1.2.6
Sekarang untuk mencipta aplikasi itu sendiri Buat fail yang dipanggil app.js atau server.js, mana-mana yang anda suka, import ekspres, dan kemudian gunakan express() untuk mencipta aplikasi baharu:
var express = require('express'); var app = express();
Kejadian aplikasi baharu boleh mula menentukan laluan melalui app.VERB(), dalam kes ini membalas permintaan "GET/" dengan rentetan "Hello World". req dan res ialah objek nod yang sama yang diberikan kepada anda, jadi anda mungkin memanggil res.pipe(), req.on('data', panggil balik) dan perkara lain yang anda akan lakukan yang tiada kaitan dengan Express.
Express mempertingkatkan objek ini untuk memberikan anda antara muka peringkat lebih tinggi seperti res.send(), selain menambah panjang kandungan untuk anda:
app.get('/hello.txt', function(req, res){ res.send('Hello World'); });
Sekarang panggil kaedah app.listen() untuk sambungan mengikat dan mendengar, menerima parameter yang sama seperti jaring nod.Server #listen():
var server = app.listen(3000, function() { console.log('Listening on port %d', server.address().port); });
Gunakan ekspres(1) untuk menjana aplikasi
Pasukan Express mengekalkan penjana projek yang mudah dinamakan penjana ekspres(1). Jika anda memasang penjana ekspres secara global menggunakan npm, anda boleh mengaksesnya dari mana-mana sahaja pada komputer anda:
$ npm install -g express-generator
Alat ini menyediakan cara mudah untuk mendapatkan rangka kerja aplikasi, tetapi skop terhad, contohnya, ia hanya menyokong beberapa enjin templat, manakala Express sendiri sebenarnya menyokong membina mana-mana templat rangka kerja tapak web untuk nod. Boleh dilihat melalui bantuan:
Usage: express [options] Options: -h, --help output usage information -V, --version output the version number -e, --ejs add ejs engine support (defaults to jade) -H, --hogan add hogan.js engine support -c, --css add stylesheet support (less|stylus|compass) (defaults to plain css) -f, --force force on non-empty directory
Jika anda ingin menjana aplikasi yang menyokong sebarang situasi, anda hanya perlu melaksanakan::
$ express --css stylus myapp create : myapp create : myapp/package.json create : myapp/app.js create : myapp/public create : myapp/public/javascripts create : myapp/public/images create : myapp/public/stylesheets create : myapp/public/stylesheets/style.styl create : myapp/routes create : myapp/routes/index.js create : myapp/views create : myapp/views/index.jade create : myapp/views/layout.jade install dependencies: $ cd myapp && npm install run the app: $ DEBUG=myapp node app
Seperti mana-mana aplikasi nod lain, anda mesti memasang kebergantungan berikut:
Kalau begitu mari kita mulakan.
$ npm start
Itu sahaja yang anda perlukan untuk mengaktifkan dan menjalankan apl mudah. Ingat, Express tidak terikat dengan mana-mana struktur direktori tertentu, ini hanya untuk memberi anda panduan. Pilihan struktur aplikasi boleh dilihat dalam contoh dalam repositori github.
Ralat pengendalian
Ralat mengendalikan middleware ditakrifkan sama seperti middleware biasa, tetapi ia mesti menentukan bilangan 4 parameter Ini ialah tandatangan fungsi (err, req, res, next):
app.use(function(err, req, res, next){ console.error(err.stack); res.send(500, 'Something broke!'); });
Walaupun perisian tengah pengendalian ralat mandatori biasanya tidak ditakrifkan pada penghujungnya, selepas app.use( lain), panggilannya adalah seperti berikut:
var bodyParser = require('body-parser'); var methodOverride = require('method-override'); app.use(bodyParser()); app.use(methodOverride()); app.use(app.router); app.use(function(err, req, res, next){ // logic });
Respons dalam middleware ini adalah sewenang-wenangnya. Anda mungkin ingin membalas dengan halaman ralat HTML, mesej ringkas, rentetan JSON atau sebarang respons lain yang anda suka.
Untuk membina rangka kerja yang teratur dan peringkat lebih tinggi, anda boleh menentukan beberapa perisian tengah pengendalian ralat ini, sama seperti anda mentakrifkan perisian tengah biasa. Sebagai contoh, katakan anda ingin menentukan pengendali ralat untuk permintaan XHR Selain daripada ini, anda boleh melakukan perkara berikut:
var bodyParser = require('body-parser'); var methodOverride = require('method-override'); app.use(bodyParser()); app.use(methodOverride()); app.use(app.router); app.use(logErrors); app.use(clientErrorHandler); app.use(errorHandler);
Dalam logError yang lebih umum, anda boleh menulis permintaan dan mesej ralat ke perkhidmatan stderr, loggly atau serupa:
function logErrors(err, req, res, next) { console.error(err.stack); next(err); }
Takrif clientErrorHandler adalah seperti berikut, ambil perhatian bahawa ralat ini akan dihantar kepada yang seterusnya secara eksplisit.
function clientErrorHandler(err, req, res, next) { if (req.xhr) { res.send(500, { error: 'Something blew up!' }); } else { next(err); } }
Pelaksanaan errorHandler "seluruh" berikut boleh ditakrifkan sebagai:
function errorHandler(err, req, res, next) { res.status(500); res.render('error', { error: err }); }
Pengiraan dalam talian pengguna
Bahagian ini menerangkan secara terperinci aplikasi (kecil) yang menggunakan Redis untuk menjejaki bilangan pengguna dalam talian. Mula-mula buat pakej. Fail json mengandungi dua lampiran, satu untuk klien redis dan satu lagi untuk Express sendiri. Juga pastikan anda telah membungkus redis dan berjalan melalui $redis-server.
{ "name": "app", "version": "0.0.1", "dependencies": { "express": "3.x", "redis": "*" } }
Seterusnya, anda perlu membuat aplikasi dan sambungan ke redis:
var express = require('express'); var redis = require('redis'); var db = redis.createClient(); var app = express();
Perisian tengah seterusnya menjejaki pengguna dalam talian. Di sini kami akan menggunakan set yang diisih, supaya kami boleh menyoal pengguna dalam talian melalui redis, yang hanya mengambil masa N milisaat. Kami menggunakan cap masa sebagai "standard dalam talian" untuk ahli. Ambil perhatian bahawa di sini kami menggunakan rentetan ejen pengguna dan bukannya id pengguna biasa.
app.use(function(req, res, next){ var ua = req.headers['user-agent']; db.zadd('online', Date.now(), ua, next); });
Perisian tengah seterusnya ialah menggunakan zrevrangebyscore untuk mendapatkan bilangan maksimum pengguna dalam talian pada saat terakhir Kami sentiasa mendapat pengguna dalam talian yang paling terkini, dan had atasnya ialah cap masa semasa tolak 60000 milisaat.
app.use(function(req, res, next){ var min = 60 * 1000; var ago = Date.now() - min; db.zrevrangebyscore('online', '+inf', ago, function(err, users){ if (err) return next(err); req.online = users; next(); }); });
最后,我们通过一个url使用它,并绑定到一个端口!这就完了,在一个新浏览器访问这个应用程序,您会看到在线人数增加。
app.get('/', function(req, res){ res.send(req.online.length + ' users online'); }); app.listen(3000);
Expree的反向代理
在反向代理背后使用Expree,如Varnish 或Nginx是微不足道的,然而它需要配置。通过启用“信任代理”设置app.enable(“trust proxy”),Express有一些反向代理的技巧,X-Forwarded - *头字段可能是可信的,否则他们可能很容易被欺骗。
启用该设置有一些微妙的影响。第一个是X-Forwarded-Proto可能被反向代理设定,告诉app那是https或者只是简单的http。这个值由req.protocol反射。
第二个变化是req.ip和req.ips值将填充X-Forwarded-For地址的列表。
调试Express
Express内部使用调试模块记录路径匹配和应用程序模式的信息。要看到这条信息,只要简单设置调试环境变量为express:*,当启动应用程序后,你将在控制台看以调试信息。
$ DEBUG=express:* node ./bin/www
运行这个hello world示例将打印以下内容:
express:application booting in development mode +0ms express:router defined get /hello.txt +0ms express:router defined get /hello.txt +1ms
另外, 表达可执行(生成器)生成的程序也使用调试模块,默认作用域是my-application调试命名空间。
你可以用以下命令启用这些调试语句
$ DEBUG=my-application node ./bin/www
关于调试的更多信息,请参见调试 指南