Trước đây, tôi đã chơi với Kue nhưng gói đã không được cập nhật trong khoảng 4 năm và hiện tại họ khuyên bạn nên làm như vậy .
Khi xây dựng API, mục tiêu luôn là trả về phản hồi trong thời gian nhanh nhất có thể. Nhưng có những lúc chúng tôi muốn chạy một số công việc dựa trên thông tin chúng tôi có trong logic mã của chúng tôi sau này. Đây là nơi Bull đến
Bull là hàng đợi công việc ưu tiên giàu tính năng dành cho Node. js được hỗ trợ bởi Redis. Nó cho phép chúng tôi ủy quyền quy trình/công việc đó cho Redis để chạy trong nền trong khi trả về phản hồi ngay lập tức. Bull tuân theo định dạng Nhập trước xuất trước, nhưng chúng ta có thể đặt mức độ ưu tiên cho các công việc của mình trong cấu hình và công việc có mức độ ưu tiên cao hơn sẽ được ưu tiên hơn công việc có mức độ ưu tiên thấp hơn
Tổng quan ngắn gọn về những gì chúng ta sẽ xây dựng
Trong bài viết này, chúng ta sẽ xây dựng một API đăng ký người dùng và gửi cho họ email cùng với tin nhắn văn bản khi đăng ký thành công. Chúng tôi sẽ sử dụng Công việc ưu tiên của Kue để gửi email và tin nhắn văn bản Chào mừng với sự trợ giúp của Sendgrid và API nhắn tin Twilio
điều kiện tiên quyết
nút js
Thể hiện
MongoDB
Thiết lập máy chủ của chúng tôi
Chúng tôi sẽ xây dựng bản trình diễn này bằng ExpressJs, một Nút tối thiểu và linh hoạt. js khung ứng dụng web cung cấp một bộ tính năng mạnh mẽ cho các ứng dụng web và di động. Điều quan trọng là phải cài đặt Node trên máy cục bộ của bạn. Để xác minh rằng bạn đã cài đặt nút, hãy mở thiết bị đầu cuối của bạn và chạy lệnh sau.
node --v
Nếu bạn chưa cài đặt Node, bạn có thể tải xuống tại đây
Tiếp theo, chúng tôi sẽ cần tạo một thư mục để chứa mã phía máy chủ của chúng tôi và chúng tôi có thể làm điều đó bằng cách chạy lệnh trong thiết bị đầu cuối bên dưới
mkdir
Sau đó, chúng tôi c thay đổi thư mục thành thư mục mới của chúng tôi, mở nó trong trình chỉnh sửa mã của chúng tôi và chạy lệnh init để khởi tạo nút của chúng tôi . json cho chúng tôi.
npm init
Sau khi khởi tạo ứng dụng của chúng tôi và tạo gói của chúng tôi. json, chúng tôi sẽ cài đặt các gói sau để bắt đầu
npm i express redis bull mongoose dotenv twilio @sendgrid/mail mailgen
Sau khi cài đặt các phụ thuộc của chúng tôi, chúng tôi sẽ cần viết mã để khởi động máy chủ của chúng tôi trong chỉ mục của chúng tôi. js như bên dưới
require["dotenv"].config[]; const express = require["express"]; const app = express[]; const port = process.env.PORT || 4000; app.listen[port, [] => console.log[`App listening on port ${port}`]];
Thiết lập cấu trúc tệp
Bây giờ, chúng ta sẽ thiết lập cấu trúc tệp cho mã của mình
Để tính năng này hoạt động, bạn cần cài đặt cục bộ MongoDB và Redis. Bạn có thể tải xuống bản cài đặt cục bộ của MongoDB tại đây và của Redis tại đây. Ngoài ra, bạn có thể thiết lập một bậc MongoDB miễn phí trên tập bản đồ bằng liên kết này và sử dụng liên kết kết nối của họ
Chúng ta cũng sẽ thiết lập cấu hình cơ sở dữ liệu của mình, cấu hình này sẽ bao gồm các cấu hình dành cho kết nối với MongoDB, như bên dưới.
require["dotenv"].config[]; const mongoose = require["mongoose"]; let mongoUrl = null; const mongoConnection = [] => { if [process.env.NODE_ENV === "test"] { mongoUrl = process.env.TEST_DB; } else { mongoUrl = process.env.DATA_DB; } return mongoose.connect[mongoUrl, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false, }]; }; module.exports = mongoConnection;
Mã trong tệp ở trên chứa logic để kết nối với cơ sở dữ liệu MongoDB của chúng tôi
Tiếp theo, chúng tôi sẽ bổ sung lược đồ người dùng của mình như bên dưới
const mongoose = require["mongoose"]; const userSchema = new mongoose.Schema[ { firstName: { type: String, required: [true, "User must have a first Name"], trim: true, lowercase: true, }, lastName: { type: String, required: [true, "User must have a last Name"], trim: true, lowercase: true, }, sex: { type: String, required: [true, "Sex is required"], trim: true, lowercase: true, }, email: { type: String, unique: true, required: [true, "User must have an email"], trim: true, lowercase: true, }, dateOfBirth: { type: Date, required: [true, "User must have a Date of Birth"], }, phoneNumber: { type: String, required: [true, "User must have a Phone Number"], }, }, { timestamps: true } ]; module.exports = mongoose.model["User", userSchema];
Đăng ký người dùng và sử dụng Kue Priority Jobs để gửi email và tin nhắn chào mừng
Bây giờ, chúng tôi sẽ tiếp tục tạo tệp đăng ký trong bộ điều khiển của mình để xử lý logic tạo người dùng của chúng tôi. Chúng tôi cũng sẽ gửi email và tin nhắn văn bản cho người dùng của mình khi đăng ký trước khi trả lời phản hồi bằng Bull.
Để làm điều này, hãy làm theo các bước sau
Trước tiên, chúng tôi sẽ tạo một số chức năng trợ giúp để giúp chúng tôi gửi email và tin nhắn văn bản chào mừng tới những người dùng mới đăng ký của chúng tôi
Để gửi email chào mừng, bạn có thể tham khảo chức năng trợ giúp bên dưới
require["dotenv"].config[]; const Mailgen = require["mailgen"]; const sgMail = require["@sendgrid/mail"]; sgMail.setApiKey[process.env.SENDGRID_API_KEY]; function welcomeEmail[job, done] { const mailGenerator = new Mailgen[{ theme: "default", product: { name: "Aeeiee", link: `//aeeiee.com`, }, }]; const mail = { body: { name: `${job.firstName} ${job.lastName}`, intro: "Welcome to Aeeiee! We're very excited to have you on board.", action: { instructions: "To get started with Aeeiee, please click here:", button: { color: "#22BC66", text: "Checkout our Website", link: `//aeeiee.com`, }, }, outro: "Need help, or have questions? Just reply to this email, we'd love to help.", }, }; const emailBody = mailGenerator.generate[mail]; const emailText = mailGenerator.generatePlaintext[mail]; const mailOption = { to: job.email, from: `${process.env.SENDERS_EMAIL}`, subject: "Welcome to Aeeiee", html: emailBody, text: emailText, }; done[]; return sgMail.send[mailOption]; } module.exports = { welcomeEmail };
Tương tự như vậy, để gửi tin nhắn văn bản bằng cách sử dụng Twilio , bạn có thể sử dụng chức năng trợ giúp bên dưới. Nếu chưa thiết lập Twilio, bạn có thể theo liên kết này để tìm hiểu cách thiết lập Twilio và tạo thông tin xác thực API của mình.
- Tiếp theo, chúng ta sẽ tạo tệp cấu hình Bull để xử lý logic của Hàng đợi công việc của chúng ta.
const Queue = require["bull"]; const queue = new Queue["Jobs"]; const { welcomeEmail } = require["../helpers/welcomeEmail"]; const { sendText } = require["../helpers/twilio"]; const createJob = [options, data] => { const opts = { priority: 0, attempts: 5}; queue.add[options, data, { attempts: opts.attempts, backoff: { type: "exponential", delay: 2000, }, removeOnComplete: true, removeOnFail: true, }]; }; queue.process["Welcome email", [job, done] => welcomeEmail[job.data, done]]; queue.process["Send Text", [job, done] => sendText[job.data, done]]; module.exports = { createJob };
Mã trên hiển thị một số cấu hình chúng tôi đang đặt cho phiên bản Bull của chúng tôi. Công việc của chúng tôi là sẽ cố gắng chạy lại 5 lần trong trường hợp thất bại. Chúng tôi cũng đang đặt công việc bị xóa khỏi hàng đợi khi hoàn thành hoặc thất bại. Và cuối cùng, chúng tôi có cài đặt dự phòng để giúp giới hạn tỷ lệ của bên thứ ba.
- Sau đó, chúng tôi tạo bộ điều khiển đăng ký giúp chúng tôi đăng ký người dùng của mình
mkdir0
Sau đó, chúng tôi hiển thị bộ điều khiển này bằng cách tạo một tuyến đường hiển thị nó. Chúng tôi sẽ làm điều này bằng cách tạo một điểm cuối trong thư mục tuyến đường của chúng tôi như hình bên dưới
mkdir1
Điểm cuối đăng ký của chúng tôi sẽ có sẵn tại http. //máy chủ cục bộ. 4000/đăng ký. Bây giờ chúng ta có thể gọi điểm cuối của mình bằng Postman với dữ liệu cần thiết và nhận lại phản hồi như hình bên dưới
Chúng tôi cũng sẽ nhận được email và tin nhắn văn bản như hình bên dưới, đây là bằng chứng cho thấy công việc của chúng tôi đang chạy
Đây là một ví dụ rất cơ bản về việc sử dụng Bull để tạo và lên lịch Công việc. Có nhiều tùy chọn hơn trong bull như Trình xử lý sự kiện, Bộ giới hạn tỷ lệ, Loại công việc, sử dụng biểu thức Cron, v.v. Truy cập tài liệu chính thức để biết thêm thông tin. Mã đầy đủ có thể được tìm thấy ở đây