Được rồi, đây là một câu hỏi khá rộng và tôi chắc chắn không phải là chuyên gia, nhưng tôi sẽ cố gắng hết sức ở đây.
TL; DR
-
routes
là bộ điều khiển cho biết logic nào sẽ thực thi khi người dùng điều hướng trình duyệt của họ đến một đường dẫn nhất định trong ứng dụng của bạn, bao gồm cả chế độ xem sẽ hiển thị và dữ liệu nào sẽ gửi đến các chế độ xem đó -
models
chỉ là - các mô hình dữ liệu trong ứng dụng của bạn -
module.exports =
cho một tệp biết chính xác nội dung mà nó "xuất", đó là mã cần được thực thi hoặc có thể truy cập từ tệp ứng dụng chính của bạn. -
require(..)
bao gồm một mô-đun. Bạn có thể đặt điều này trên một biến để bạn có thể gọi các hàm mô-đun sau này hoặc chỉ cần thực thi một hàm nếu đó là tất cảmodule.exports
lợi nhuận.
Kết hợp các kỹ thuật này có thể giúp bạn tạo ra một khuôn khổ vững chắc cho bất kỳ ứng dụng nào của bạn.
Câu trả lời dài
Express cung cấp một khuôn khổ vững chắc để cấu trúc ứng dụng Node.js của bạn. Node hoàn toàn độc lập với Express, nhưng vì Express phổ biến như thế nào nên chúng thực tế đi đôi với nhau. Sau khi được cài đặt, Express có thể được sử dụng để tạo một dự án web giàn giáo (với các tùy chọn) để bạn xây dựng trên đó nếu bạn muốn.
Bộ điều khiển
Dự án đã tạo sẽ tạo /routes/index.js
, (nếu bạn hiểu MVC) về cơ bản là bộ điều khiển chính của bạn . Một tuyến đường trong express được viết như vậy:
app.get('/path', function(req, res, next){ .. } );
Hãy phân tích điều đó:biến ứng dụng của chúng tôi (ứng dụng) đang được thông báo rằng trên một yêu cầu GET tới '/path'
để thực thi một hàm gọi lại ẩn danh với req, res, next
các biến (yêu cầu, phản hồi, gọi lại tương ứng). Tôi thấy hữu ích khi nghĩ về điều này giống như một trình xử lý sự kiện tùy chỉnh.
Điều quan trọng cần lưu ý tại thời điểm này là chúng ta cũng có thể gọi app.post
với cùng một cú pháp cho các bài đăng đến một URL thay vì được.
Trong cuộc gọi lại ẩn danh của mình, chúng tôi xử lý mọi dữ liệu đến và hiển thị chế độ xem cho người dùng. Đây là nơi mà hầu hết logic nghiệp vụ của tôi kết thúc, vì vậy thực sự là hợp lý khi KHÔNG sử dụng các hàm ẩn danh ở đây. Đây là ví dụ về lệnh gọi lại cơ bản chỉ hiển thị trang chủ:
app.get('/', function(req, res, next){
//some business logic
res.render('views/home');
});
Khi người dùng cố gắng NHẬN đường dẫn chỉ mục của ứng dụng của chúng tôi (/
), chúng tôi chỉ hiển thị home
của chúng tôi xem rằng, từ gốc của dự án của chúng tôi, được lưu trữ trong một views
thư mục.
Nhưng điều gì sẽ xảy ra nếu chúng ta muốn mô-đun hóa điều này để chúng ta không khai báo tất cả các tuyến đường của mình trong app.js
chính của chúng ta hoặc server.js
?
Chúng tôi sử dụng module.exports = ..
trong các mô-đun của chúng tôi để cho máy chủ của chúng tôi biết chính xác những gì cần bao gồm. Trong bộ điều khiển của mình, tôi xuất một hàm duy nhất lấy ứng dụng làm đối số và sử dụng hàm đó để xác định các tuyến của chúng tôi như sau:
Bộ điều khiển / Người dùng.js
module.exports = function(app){
app.get('/users', function(req, res){
var users = req.db.collection('users').find();
if (!users) {
console.log("no users found");
res.redirect('/');
} else {
res.render('users/index', {users : users});
}
});
};
Đừng lo lắng về req.db
mã, tôi đính kèm cơ sở dữ liệu vào yêu cầu trong ứng dụng của mình nhưng điều đó không được thực hiện theo mặc định. Hãy hiểu đơn giản rằng tôi đang nhận danh sách 'người dùng' ở đây và chuyển hướng người dùng đến chỉ mục của ứng dụng của tôi nếu không có bất kỳ chỉ mục nào.
Mô hình
Mongoose cung cấp cho chúng ta một giao diện tuyệt vời để viết các mô hình. Với mongoose, viết mô hình là một quá trình gồm ba bước:
- Xác định một lược đồ
- Xác định logic mô hình
- Tạo và xuất mô hình
Đây là ví dụ về User
mô hình:
Mô hình / Người dùng.js
var mongoose = require('mongoose'),
userSchema = new mongoose.Schema({
name: { type: String, required: true },
joinDate: {type: Date, default: date.now }
}),
User = mongoose.model('user', userSchema);
module.exports = user;
Ứng dụng máy chủ
module.exports
được sử dụng để giúp chúng tôi xác định một số mô-đun cho cơ sở mã của chúng tôi. Khi chúng tôi chạy một ứng dụng nút, cuối cùng chúng tôi đang chạy một tệp JavaScript duy nhất (bạn đã thấy tệp đó với server.js
hoặc app.js
).
Để giữ cho tệp này không quá lớn với nhiều mô hình và tuyến đường, chúng tôi sử dụng require(module)
để bao gồm mã từ các tệp JS khác. module
trong trường hợp của chúng tôi sẽ là một đường dẫn đến mô-đun mà chúng tôi muốn yêu cầu. Nếu bạn có cấu trúc tài liệu sau:
| Controllers
- User.js
| Models
- User.js
| Views
app.js
Để bao gồm bộ điều khiển người dùng của bạn từ app.js
, bạn sẽ viết:require('./Controllers/User')
. Vì mô-đun bộ điều khiển của chúng tôi chỉ đơn giản là xuất các hàm, chúng tôi có thể gọi hàm đó ngay sau câu lệnh request bằng cách thêm dấu ngoặc đơn vào cuối (với bất kỳ tham số nào được yêu cầu). Bao gồm các bộ điều khiển của tôi trông giống như vậy:
require('./Controllers/User')(app)
Tôi đang chuyển trong ứng dụng thực tế, vì mô-đun của tôi (bên dưới) chỉ xuất một hàm bổ sung logic nghiệp vụ vào các tuyến ứng dụng của tôi. Điều này chỉ cần được gọi và không bao giờ được sử dụng, vì vậy tôi không nắm bắt bộ điều khiển của mình như một biến để gọi các phương thức sau này.
Việc bao gồm các mô hình hơi khác một chút, vì chúng tôi có thể muốn thực hiện một số hoạt động mà mô hình của chúng tôi xác định. Chúng tôi có thể làm điều này bằng cách thay đổi mã yêu cầu của chúng tôi một chút:
var User = require('./Models/User');
Bây giờ chúng ta có thể gọi các phương thức của mô hình Người dùng của mình bất cứ khi nào. Mongoose cung cấp miễn phí cho chúng tôi rất nhiều chức năng cơ bản:
User.find({}, function(err, users){ .. });
Hàm trên sẽ đi tìm tất cả người dùng của chúng tôi và sau đó thực thi một hàm ẩn danh với một err
tiềm năng (là rỗng nếu không có vấn đề) và sau đó là danh sách người dùng của chúng tôi ở định dạng JSON. Khá tiện lợi.
Kết hợp tất cả các khái niệm này là cách bạn tạo một ứng dụng web cơ bản bằng Express và Node.js. Vui lòng cho tôi biết trong phần bình luận nếu tôi có thể làm rõ bất kỳ điều gì về cách tôi sử dụng Express. Đây là kiến thức rất bề ngoài và tôi khuyên bạn nên đào sâu vào tài liệu và xem xét các plugin để mở rộng khả năng của ứng dụng của bạn. Chúc bạn thành công!