Penghalaan Node.js


Kami perlu menyediakan URL yang diminta dan parameter GET dan POST lain yang diperlukan untuk laluan, dan kemudian laluan perlu melaksanakan kod yang sepadan berdasarkan data ini.

Oleh itu, kita perlu melihat permintaan HTTP dan mengekstrak URL yang diminta dan parameter GET/POST. Sama ada fungsi ini milik penghalaan atau pelayan (atau malah sebagai fungsi modul itu sendiri) sememangnya wajar dibincangkan, tetapi di sini ia dianggap sementara sebagai fungsi pelayan HTTP kami.

Semua data yang kami perlukan akan terkandung dalam objek permintaan, yang diluluskan sebagai parameter pertama fungsi panggil balik onRequest(). Tetapi untuk menghuraikan data ini, kami memerlukan modul Node.JS tambahan, iaitu modul url dan rentetan pertanyaan.

                   url.parse(string).query
                                           |
           url.parse(string).pathname      |
                       |                   |
                       |                   |
                     ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                                ---       -----
                                 |          |
                                 |          |
              querystring(string)["foo"]    |
                                            |
                         querystring(string)["hello"]

Sudah tentu kita juga boleh menggunakan modul rentetan pertanyaan untuk menghuraikan parameter dalam badan permintaan POST, yang akan ditunjukkan kemudian.

Sekarang mari kita tambahkan beberapa logik pada fungsi onRequest() untuk mengetahui laluan URL yang diminta oleh penyemak imbas:

var http = require("http");
var url = require("url");

function start() {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;

Baiklah, aplikasi kami kini boleh melepasi laluan URL yang diminta untuk membezakan antara yang berbeza permintaan - ini membolehkan kami menggunakan penghalaan (belum lengkap) untuk memetakan permintaan kepada pengendali berdasarkan laluan URL.

Dalam aplikasi yang kami bina, ini bermakna permintaan daripada /mula dan /muat naik boleh dikendalikan dengan kod yang berbeza. Kita lihat bagaimana ini sesuai bersama kemudian.

Kini kita boleh menulis laluan yang dinamakan router.js dan menambah kandungan berikut:

function route(pathname) {
  console.log("About to route a request for " + pathname);
}

exports.route = route;

Seperti yang anda lihat, apakah kod ini? tidak melakukannya juga, tetapi buat masa ini inilah yang sepatutnya. Sebelum menambah lebih logik, mari kita lihat dahulu cara mengintegrasikan penghalaan dan pelayan.

Pelayan kami harus mengetahui kewujudan laluan dan menggunakannya dengan berkesan. Kami sudah tentu boleh mengekodkan kebergantungan ini kepada pelayan, tetapi pengalaman dengan pengaturcaraan dalam bahasa lain memberitahu kami bahawa ini akan menyusahkan, jadi kami akan menggunakan suntikan pergantungan untuk menambah modul dengan longgar.

Pertama, mari kita lanjutkan fungsi mula() pelayan untuk lulus fungsi penghalaan sebagai parameter server.js Kod fail adalah seperti berikut

var http = require("http");
var url = require("url");

function start(route) {
  function onRequest(request, response) {
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");

    route(pathname);

    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;

Pada masa yang sama. masa, kami Index.js akan dilanjutkan dengan sewajarnya supaya fungsi penghalaan boleh disuntik ke dalam pelayan:

var server = require("./server");
var router = require("./router");

server.start(router.route);

Di sini, fungsi yang kami lalui masih tidak melakukan apa-apa.

Jika anda memulakan aplikasi sekarang (node ​​​​index.js, sentiasa ingat baris arahan ini) dan kemudian meminta URL, anda akan melihat aplikasi mengeluarkan maklumat yang sepadan, yang menunjukkan bahawa pelayan HTTP kami sudah pun menggunakan modul penghalaan , dan akan melepasi laluan yang diminta ke laluan:

$ node index.js
Server has started.

Output di atas telah mengalih keluar bahagian berkaitan permintaan /favicon.ico yang menjengkelkan.

Akses pelayar http://127.0.0.1:8888/, hasil output adalah seperti berikut:

251.jpg