1. Trang chủ
  2. » Công Nghệ Thông Tin

Sử dụng CoffeeScript trên máy chủ

9 5 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 173,84 KB

Nội dung

Gọi tất cả các dịch vụ web Ứng dụng web trong Phần 3 đã dùng một từ khóa để thực hiện một tìm kiếm trên cả Google lẫn Twitter. Về phía máy khách của của ứng dụng, bạn chỉ cần tạo mô hình giả định các kết quả từ máy chủ. Để thực sự thực hiện các hàm như vậy, bạn cần phía máy chủ của ứng dụng để gọi các dịch vụ web được Google và Twitter cung cấp. Cả hai công ty đều cung cấp các dịch vụ tìm kiếm rất đơn giản. Tất cả những gì bạn...

Sử dụng CoffeeScript máy chủ Gọi tất dịch vụ web Ứng dụng web Phần dùng từ khóa để thực tìm kiếm Google lẫn Twitter Về phía máy khách của ứng dụng, bạn cần tạo mơ hình giả định kết từ máy chủ Để thực thực hàm vậy, bạn cần phía máy chủ ứng dụng để gọi dịch vụ web Google Twitter cung cấp Cả hai công ty cung cấp dịch vụ tìm kiếm đơn giản Tất bạn cần làm tạo yêu cầu HTTP GET với dịch vụ tìm kiếm Liệt kê cho thấy hàm tổng quát để tạo yêu cầu HTTP GET Liệt kê Tìm nạp tài nguyên web http = require "http" fetchPage = (host, port, path, callback) -> options = host: host port: port path: path req = http.get options, (res) -> contents = "" res.on 'data', (chunk) -> contents += "#{chunk}" res.on 'end', () -> callback(contents) req.on "error", (e) -> console.log "Erorr: {e.message}" Ở phần đầu kịch lệnh câu lệnh require (yêu cầu), mà bạn thấy tóm tắt Phần loạt Đây cú pháp nhập mô đun Node.js phiên CoffeeScript Phiên "nguyên gốc" var http = require("http"); Trong này, bạn sử dụng số mô đun lõi Node.js (Thông tin chi tiết việc cách hoạt động mơ đun nằm ngồi phạm vi viết này) Tất mô đun sử dụng có sẵn cho bạn bạn cài đặt Node.js (xem Phần 1) Với ví dụ Liệt kê 1, bạn sử dụng mơ đun http, có cung cấp vài lớp hàm có ích cho việc tạo lẫn tiếp nhận yêu cầu HTTP Sau Liệt kê định nghĩa hàm fetchPage nhận bốn tham số:     Tên host (máy chủ) tài nguyên port (cổng) tài nguyên path (đường dẫn) tài nguyên Một hàm callback (gọi lại) Bất kỳ kiểu hàm Vào/Ra (I/O) Node.js chất khơng đồng cần hàm callback để gọi hồn thành Hàm fetchPage nhận hàm callback làm tham số thứ tư Hàm fetchPage sử dụng ba tham số để tạo yêu cầu HTTP GET cách sử dụng hàm get mô đun http Hàm fetchPage nhận hàm callback chuyển cá thể ClientResponse ClientResponse, đối tượng định nghĩa mô đun http, thực giao diện ReadableStream (một giao diện cốt lõi Node.js) Nó giao diện không đồng nhận hai kiện: data (dữ liệu) end (kết thúc) Hàm sử dụng để đăng ký gọi lại đến kiện Sự kiện liệu xảy tiếp nhận liệu từ tài nguyên mà bạn tạo yêu cầu HTTP GET để lấy Tất liệu trả lúc từ tài nguyên, phổ biến hơn, liệu gửi theo bó (chunk) Khi nhận bó, kiện liệu khởi động hàm gọi lại gọi Bạn tạo biến có tên contents (các nội dung); bạn nhận bó khác, bạn cần gắn thêm vào contents Khi nhận tất liệu, kiện end khởi động Bây bạn có tất liệu, bạn chuyển contents trở lại cho hàm callback chuyển tới hàm fetchPage Khi định nghĩa hàm đa này, tạo số hàm chuyên dụng cho API tìm kiếm Google Twitter, Liệt kê Liệt kê Các hàm tìm kiếm Google Twitter googleSearch = (keyword, callback) -> host = "ajax.googleapis.com" path = "/ajax/services/search/web?v=1.0&q=#{encodeURI(keyword)}" fetchPage host, 80, path, callback twitterSearch = (keyword, callback) -> host = "search.twitter.com" path = "/search.json?q=#{encodeURI(keyword)}" fetchPage host, 80, path, callback Có hai hàm định nghĩa Liệt kê 2:   googleSearch, nhận keyword (từ khóa) hàm callback Nó ấn định máy chủ, tạo động đường dẫn cách sử dụng phép nội suy chuỗi CoffeeScript sau sử dụng hàm fetchPage twitterSearch, giống với googleSearch có máy chủ giá trị đường dẫn khác Đối với hai giá trị đường dẫn, bạn sử dụng phép nội suy chuỗi hàm encodeURI tiện dụng JavaScript để xử lý khoảng trống ký tự đặc biệt khác Vì bạn có hàm tìm kiếm này, nên bạn tạo hàm chuyên dụng cho kịch tìm kiếm kết hợp Về đầu trang Kết hợp hàm khơng đồng Có vài cách để bạn thực tìm kiếm kết hợp Google Twitter Bạn gọi googleSearch sau đó, hàm callback, gọi twitterSearch, ngược lại Tuy nhiên, kiến trúc không đồng bộ/gọi lại Node.js cho phép bạn làm việc cáchđẹp đẽ hiệu Liệt kê hiển thị tìm kiếm kết hợp Liệt kê Tìm kiếm Google lẫn Twitter combinedSearch = (keyword, callback) -> data = google : "" twitter : "" googleSearch keyword, (contents) -> contents = JSON.parse contents data.google = contents.responseData.results if data.twitter != "" callback(data) twitterSearch keyword, (contents) -> contents = JSON.parse contents data.twitter = contents.results if data.google != "" callback(data) Hàm combinedSearch có chữ ký mà quen thuộc: nhận từ khóa hàm gọi lại Sau đó, tạo cấu trúc liệu cho kết tìm kiếm kết hợp gọi data Đối tượng data có trường google trường twitter, hai khởi tạo chuỗi rỗng Bước gọi hàm googleSearch Trong hàm gọi lại nó, bạn phân tích cú pháp kết từ Google cách sử dụng hàm JSON.parse tiêu chuẩn Văn JSON trả từ Google phân tích cú pháp thành đối tượng JavaScript Sử dụng đối tượng để thiết lập giá trị trường data.google Sau gọi googleSearch, gọi twitterSearch Hàm callback giống với hàm callback dùng cho googleSearch Điều quan trọng cần hiểu hai hàm gọi lại mà bạn kiểm tra để xem liệu bạn có liệu từ hàm gọi lại khác không Bạn hàm gọi lại hồn thành trước tiên Vì vậy, kiểm tra để xem liệu bạn có liệu từ Google lẫn Twitter khơng Một bạn làm điều đó, bạn gọi hàm callback chuyển tới hàm combinedSearch Bây bạn có hàm tìm kiếm Google lẫn Twitter đưa kết kết hợp Nhiệm vụ trưng hàm cho trang web mà bạn tạo Phần loạt Tất bạn phải làm viết máy chủ web Về đầu trang Một máy chủ web CoffeeScript Lúc này, bạn có:   Một trang web gửi từ khố hiển thị kết tìm kiếm Một hàm dùng từ khóa tạo kết tìm kiếm từ Google Twitter Cái gắn kết thứ lại với nhau? Bạn gọi máy chủ web, máy chủ ứng dụng, chí phần mềm trung gian Bất kể bạn muốn gọi gì, khơng cần dùng nhiều mã CoffeeScript để viết Máy chủ web cần đáp ứng hai mục đích Rõ ràng, cần nhận u cầu cho việc tìm kiếm kết hợp Nó cần cung cấp tài nguyên tĩnh mà bạn tạo Phần Bạn tạo ứng dụng web, đó, bạn phải ý đến quy định Các gọi tìm kiếm phải tới nơi tạo trang web Trước tiên xử lý tài nguyên tĩnh Liệt kê cho thấy hàm để cung cấp tài nguyên tĩnh Liệt kê Cung cấp tài nguyên tĩnh path = require "path" fs = require "fs" serveStatic = (uri, response) -> fileName = path.join process.cwd(), uri path.exists fileName, (exists) -> if not exists response.writeHead 404, 'Content-Type': 'text/plain' response.end "404 Not Found #{uri}!\n" return fs.readFile fileName, "binary", (err,file) -> if err response.writeHead 500, 'Content-Type': 'text/plain' response.end "Error #{uri}: #{err} \n" return response.writeHead 200 response.write file, "binary" response.end() Hàm serveStatic xử lý yêu cầu nguồn tài nguyên tĩnh ứng dụng web Lưu ý bạn cần sử dụng thêm hai mô đun Node.js nữa:   path đơn giản thư viện tiện ích để xử lý đường dẫn tệp Hệ thống tệp, fs, cung cấp tất Vào/Ra tệp Node.js trình bao gói dựa hàm POSIX tiêu chuẩn Hàm serveStatic nhận hai tham số:  uri chất đường dẫn tương đối đến tệp tĩnh trình duyệt web yêu cầu  Một đối tượng ServerResponse, kiểu khác định nghĩa mơ đun http Ngồi nhiều thứ khác, mang lại cho bạn luồng để ghi liệu vào thứ tạo yêu cầu HTTP GET tài nguyên Trong hàm serveStatic, chuyển đường dẫn tương đối đến tệp thành đường dẫn tuyệt đối cách sử dụng process.cwd Đối tượng process (tiến trình) đối tượng chung (global), đại diện cho tiến trình hệ thống mà Node.js chạy Phương thức cwd cung cấp thư mục làm việc Sử dụng mô đun path để kết hợp thư mục làm việc đường dẫn tương đối đến tệp mà bạn muốn; kết đường dẫn tuyệt đối Với đường dẫn tuyệt đối, bạn sử dụng lại mơ đun path để kiểm tra xem tệp có tồn hay khơng Việc kiểm tra xem tệp có tồn khơng liên quan đến I/O (Vào/Ra), hàm khơng đồng Chuyển cho fileName (tên tệp) hàm gọi lại Hàm gọi lại nhận giá trị Boolean, cho bạn biết liệu tệp tồn hay khơng Nếu khơng tồn tại, bạn cần viết thơng báo HTTP 404 " khơng tìm thấy tệp" Nếu tệp tồn tại, bạn cần đọc nội dung cách sử dụng mơ đun fs phương thức readFile, phương thức readFile không đồng Nó nhận fileName, kiểu hàm gọi lại Hàm gọi lại nhận hai thông số:   Một tham số lỗi cho biết vấn đề đọc tài nguyên từ hệ thống tệp Nếu có vấn đề, thông báo lỗi HTTP 500 trả ngược lại tới phía máy khách Nếu khơng có vấn đề gì, thơng báo HTTP 200 OK viết nội dung tệp gửi lại tới phía máy khách Hàm xử lý trường hợp cung cấp tệp tĩnh tương đối dễ dàng Phần thảo luận kịch khó hơn, bạn cần đáp ứng động với yêu cầu tìm kiếm Về đầu trang Các đáp ứng động máy chủ Ví dụ máy chủ web chủ yếu xử lý yêu cầu tài nguyên tĩnh yêu cầu tìm kiếm động Chiến lược sử dụng URL cụ thể để xử lý yêu cầu tìm kiếm sau chuyển yêu cầu khác tới hàm serveStatic Hãy sử dụng URL tương đối /doSearch cho yêu cầu tìm kiếm Liệt kê cho thấy mã máy chủ web Liệt kê Máy chủ web CoffeeScript url = require "url" server = http.createServer (request, response) -> uri = url.parse(request.url) if uri.pathname is "/doSearch" doSearch uri, response else serveStatic uri.pathname, response server.listen 8080 console.log "Server running at http://127.0.0.1:8080" Một lần nữa, kịch lệnh bắt đầu cách nạp mô đun Node.js Mơ đun url thư viện có ích để phân tích cú pháp URL Bước tạo máy chủ web cách sử dụng mô đun http mà bạn nạp Liệt kê Sử dụng phương thức createServer mơ đun đó, phương thức nhận hàm gọi lại gọi có yêu cầu gửi đến máy chủ web Hàm gọi lại có hai tham số: cá thể ServerRequest cá thể ServerResponse Cả hai kiều định nghĩa mô đun http Trong hàm gọi lại này, việc phân tích cú pháp URL yêu cầu gửi đến máy chủ cách sử dụng phương thức parse (phân tích cú pháp) mơ đun url Việc cung cấp cho bạn đối tượng URL bạn sử dụng thuộc tính pathname (tên đường dẫn) để nhận đường dẫn tương đối Nếu pathname /doSearch, bạn gọi hàm doSearch (được thảo luận đây) Nếu không, gọi hàm serveStatic từ Liệt kê Liệt kê cho thấy cách doSearch hoạt động Liệt kê Xử lý yêu cầu tìm kiếm doSearch = (uri, response) -> query = uri.query.split "&" params = {} query.forEach (nv) -> nvp = nv.split "=" params[nvp[0]] = nvp[1] keyword = params["q"] combinedSearch keyword, (results) -> response.writeHead 200, 'Content-Type': 'text/plain' response.end JSON.stringify results Hàm doSearch phân tích cú pháp chuỗi truy vấn URL, mà tìm thấy thuộc tính query (truy vấn) đối tượng uri Chia nhỏ chuỗi truy vấn cách tách chuỗi vị trí ký tự & Sau chia tách chuỗi vị trí dấu để nhận cặp giá trị- tên từ chuỗi truy vấn Hãy lưu trữ cặp tên-giá trị vào đối tượng params Lấy tham số "q" để có từ khóa mà bạn muốn tìm kiếm Chuyển từ khóa tới hàm combinedSearch Liệt kê Bạn phải chuyển cho hàm hàm gọi lại Hàm gọi lại ví dụ cần viết thơng báo HTTP 200 OK chuyển kết tìm kiếm thành chuỗi cách sử dụng hàm tiêu chuẩn JSON.stringify Đó tất bạn cần cho máy chủ Trong phần tiếp theo, xem cách móc nối máy chủ vào mã máy khách Phần loạt Về đầu trang Gọi máy chủ tìm kiếm Trong Phần bạn có lớp MockSearch sử dụng liệu giả đinh để cung cấp kết tìm kiếm Bây bạn định nghĩa lớp để thực tìm kiếm thực gọi máy chủ tìm kiếm Liệt kê cho thấy lớp tìm kiếm Liệt kê Lớp tìm kiếm thực class CombinedSearch search: (keyword, callback) -> xhr = new XMLHttpRequest xhr.open "GET", "/doSearch?q=#{encodeURI(keyword)}", true xhr.onreadystatechange = -> if xhr.readyState is if xhr.status is 200 response = JSON.parse xhr.responseText results = google: response.google.map (result) -> new GoogleSearchResult result twitter: response.twitter.map (result) -> new TwitterSearchResult result callback results xhr.send null Lớp CombinedSearch có phương thức search có chữ ký giống phương thức search MockSearch Nó nhận từ khóa hàm gọi lại Bên hàm này:     Sử dụng XMLHttpRequest, "người bạn cũ" quen thuộc nhà phát triển web nào, để tạo yêu cầu HTTP đến máy chủ cách sử dụng đường dẫn /doSearch từ khóa chuyển đến hàm Khi bạn nhận phản hồi, phân tích cú pháp cách sử dụng JSON.parse Tạo đối tượng kết với trường google twitter Tạo chúng cách sử dụng lớp GoogleSearchResult TwitterSearchResult Phần Chỉ cần chuyển kết trở lại hàm callback Bây giờ, bạn cần sử dụng lớp doSearch phương thức MockSearch Liệt kê cho thấy cách sử dụng lớp CombinedSearch Liệt kê Sử dụng lớp CombinedSearch @doSearch = -> $ = (id) -> document.getElementById(id) kw = $("searchQuery").value appender = (id, data) -> data.forEach (x) -> $(id).innerHTML += "

#{x.toHtml()}

" ms = new CombinedSearch ms.search kw, (results) -> appender("gr", results.google) appender("tr", results.twitter) Nếu bạn so sánh Liệt kê với doSearch Phần 3, bạn khơng thấy nhiều khác biệt Điều có khác dịng thứ bảy Thay tạo cá thể MockSearch bạn tạo cá thể CombinedSearch Những thứ khác Bạn nhận từ khóa từ trang web, gọi tìm kiếm sau gắn thêm kết cách gọi phương thức toHtml đối tượng SearchResult Hình cho thấy ứng dụng web với kết tìm kiếm "sống" đến từ máy chủ Hình Chạy ứng dụng web ví dụ Để nhận thay đổi bạn làm mã phía máy khách, bạn cần biên dịch lại coffee -c search.coffee Để chạy ứng dụng, sử dụng coffee search-server.coffee Sau đó, bạn mở trình duyệt tới địa http://127.0.0.1:8080 thử số truy vấn khác Về đầu trang Kết luận Trong này, bạn hoàn thành ứng dụng web cách xây dựng thành phần phía máy chủ để bổ sung cho mã phía máy khách Phần Giờ đây, sau hoàn thành phần cuối loạt này, bạn có ứng dụng hoàn chỉnh—tất viết CoffeeScript Bạn sử dụng nhiều tính Node.js cho phép bạn sử dụng CoffeeScript công nghệ phía máy chủ Một hạn chế đáng trách Node.js khơng chặn hàm callback gọi từ tầng sang tầng khác Điều khiến cho việc tư xếp/phân loại khó khăn với cú pháp dài dịng JavaScript chí cịn khiến việc phức tạp CoffeeScript không thay đổi nhu cầu sử dụng tất hàm callback, với cú pháp rõ ràng giúp dễ viết dễ hiểu đoạn mã chút ... hàm callback Nó ấn định máy chủ, tạo động đường dẫn cách sử dụng phép nội suy chuỗi CoffeeScript sau sử dụng hàm fetchPage twitterSearch, giống với googleSearch có máy chủ giá trị đường dẫn khác... thành chuỗi cách sử dụng hàm tiêu chuẩn JSON.stringify Đó tất bạn cần cho máy chủ Trong phần tiếp theo, xem cách móc nối máy chủ vào mã máy khách Phần loạt Về đầu trang Gọi máy chủ tìm kiếm Trong... động máy chủ Ví dụ máy chủ web chủ yếu xử lý yêu cầu tài nguyên tĩnh yêu cầu tìm kiếm động Chiến lược sử dụng URL cụ thể để xử lý yêu cầu tìm kiếm sau chuyển u cầu khác tới hàm serveStatic Hãy sử

Ngày đăng: 08/05/2021, 19:37

w