Penjelasan terperinci mengenai penggunaan Express.JS_node.js

WBOY
Lepaskan: 2016-05-16 16:41:50
asal
1549 orang telah melayarinya

Selepas memasang nod (muat turun), buat direktori pada mesin anda dan mulakan aplikasi pertama anda.

$ mkdir hello-world
Salin selepas log masuk

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"
}
}
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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();
Salin selepas log masuk

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');
});
Salin selepas log masuk

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);
});
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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

Salin selepas log masuk

Seperti mana-mana aplikasi nod lain, anda mesti memasang kebergantungan berikut:

Kalau begitu mari kita mulakan.

$ npm start
Salin selepas log masuk

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!');
});
Salin selepas log masuk

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
});
Salin selepas log masuk

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);

Salin selepas log masuk

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);
}
Salin selepas log masuk

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);
 }
}
Salin selepas log masuk

Pelaksanaan errorHandler "seluruh" berikut boleh ditakrifkan sebagai:

function errorHandler(err, req, res, next) {
 res.status(500);
 res.render('error', { error: err });
}
Salin selepas log masuk

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": "*"
 }
}
Salin selepas log masuk

Seterusnya, anda perlu membuat aplikasi dan sambungan ke redis:

var express = require('express');
var redis = require('redis');
var db = redis.createClient();
var app = express();
Salin selepas log masuk

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);
});
Salin selepas log masuk

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();
 });
});
Salin selepas log masuk

最后,我们通过一个url使用它,并绑定到一个端口!这就完了,在一个新浏览器访问这个应用程序,您会看到在线人数增加。

app.get('/', function(req, res){
 res.send(req.online.length + ' users online');
});

app.listen(3000);

Salin selepas log masuk

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
Salin selepas log masuk

运行这个hello world示例将打印以下内容:

express:application booting in development mode +0ms
express:router defined get /hello.txt +0ms
express:router defined get /hello.txt +1ms
Salin selepas log masuk

另外, 表达可执行(生成器)生成的程序也使用调试模块,默认作用域是my-application调试命名空间。

你可以用以下命令启用这些调试语句

$ DEBUG=my-application node ./bin/www
Salin selepas log masuk

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

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan