Rumah  >  Artikel  >  hujung hadapan web  >  Penjelasan terperinci mengenai penggunaan Express.JS_node.js

Penjelasan terperinci mengenai penggunaan Express.JS_node.js

WBOY
WBOYasal
2016-05-16 16:41:501533semak imbas

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

关于调试的更多信息,请参见调试 指南

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn