Chủ Nhật, 07/07/2019 | 00:00 GMT+7

Hoạt động CRUD với Mongoose và MongoDB Atlas

Learn How to Setup a Basic REST Api with Mongoose and the MongoDB Atlas Database.

Mongoose là một trong những công cụ cơ bản để thao tác dữ liệu cho phần backend Node.js / MongoDB. Trong bài viết này, ta sẽ xem xét một số cách cơ bản để sử dụng Mongoose và thậm chí sử dụng nó với database từ xa MongoDB Atlas .

Yêu cầu

Vì ta sẽ sử dụng Express để cài đặt một server cơ bản, tôi khuyên bạn nên xem bài viết này về tài liệu Express và tài liệu chính thức của Express nếu bạn chưa thực sự hài lòng với nó.

Ta cũng sẽ cài đặt REST Api rất cơ bản mà không cần bất kỳ xác thực nào, bạn có thể tìm hiểu thêm một chút về điều đó ở đây , nhưng định tuyến sẽ không đồng bộ và ta sẽ sử dụng các hàm async/await , bạn có thể làm mới tại đây .

Cài đặt

Tất nhiên, ta cũng cần phải cài đặt express để cài đặt server của bạn .

$ npm i express mongoose

Cài đặt file

Ta sẽ chỉ cần ba file và hai folder để bắt đầu. Cấu trúc folder này hoạt động tốt vì lợi ích của tổ chức nếu bạn muốn thêm nhiều hơn vào API của bạn trong tương lai:

models 📂
  FoodModel.js
routes 📂
  FoodRoutes.js
server.js

Cài đặt bản đồ MongoDB

Ta cần cài đặt với MongoDB Atlas . Dưới đây là tóm tắt các bước để bắt đầu:

  • Cài đặt một account
  • Nhấn vào Build a Cluster
  • Đi tới Truy cập database và nhấn Add New User . Thêm tên user và password , nếu bạn tự động tạo password , hãy nhớ sao chép nó, ta cần nó sau.
  • Đi tới Truy cập mạng, nhấn Add IP Address và nhấn Add Current IP Address , sau đó xác nhận.
  • Đến Clusters , nếu cụm xây dựng của bạn được thực hiện sau đó nhấn Connect , Connect Your Application , và sao chép các dòng mã nó mang lại cho bạn

Mọi thứ khác với MongoDB Atlas sẽ được ta xử lý trong Node.js.

Cài đặt người đưa thư

Ta sẽ sử dụng Postman để giúp quản lý các yêu cầu của ta đối với ta . Sau khi bạn download và cài đặt nó, hãy tạo một bộ sưu tập mới có tên là bạn muốn (của tôi sẽ được gọi là Gator Diner ). Ở dưới cùng bên phải của bộ sưu tập mới, có ba dấu chấm nhỏ cung cấp cho bạn tùy chọn 'Thêm yêu cầu'. Mỗi khi ta tạo một điểm cuối API mới, ta sẽ cài đặt một yêu cầu khác cho nó. Điều này sẽ giúp bạn quản lý mọi thứ để không phải sao chép / dán các yêu cầu HTTP ở khắp mọi nơi.

Cài đặt server

Tại đây, ta sẽ cài đặt server Express cơ bản trên cổng 3000, kết nối với database Atlas và nhập các tuyến đường trong tương lai của ta . mongoose.connect() sẽ lấy dòng mã mà ta đã sao chép từ Atlas và một đối tượng của các tùy chọn cấu hình (tùy chọn duy nhất ta sẽ sử dụng là useNewUrlParser , sẽ loại bỏ lỗi terminal khó chịu mà ta nhận được nói rằng mặc định là không dùng nữa, điều này không thay đổi hành vi hoặc cách sử dụng).

Trong mã MongoDB Atlas được cung cấp, có một phần như UserName:<password> , thay thế bằng tên user và bất kỳ password nào bạn cài đặt trong Atlas (đảm bảo loại bỏ các dấu lớn hơn / nhỏ hơn).

server.js
const express = require('express');
const mongoose = require('mongoose');
const foodRouter = require('./routes/foodRoutes.js');

const app = express();
app.use(express.json()); // Make sure it comes back as json

mongoose.connect('mongodb+srv://UserName:<password>@cluster0-8vkls.mongodb.net/test?retryWrites=true&w=majority', {
  useNewUrlParser: true
});

app.use(foodRouter);

app.listen(3000, () => { console.log('Server is running...') });

Nào, bây giờ tất cả ta đã kết nối với chương trình backend của bạn và ta có thể bắt đầu thực sự học mongoose.

Lược đồ

Đầu tiên, ta cần có một mẫu để cấu trúc dữ liệu của ta và những mẫu này được gọi là schemas . Các schemas cho phép ta quyết định chính xác dữ liệu nào ta muốn và những tùy chọn nào ta muốn dữ liệu có như một đối tượng.

Với mẫu cơ bản đó, ta sẽ sử dụng phương thức mongoose.model để làm cho nó có thể sử dụng được với dữ liệu thực tế và xuất nó dưới dạng một biến mà ta có thể sử dụng trong foodRoutes.js .

Tùy chọn

  • type Đặt xem nó là String , Number , Date , Boolean , Array hay Map (một đối tượng).
  • required (Boolean) Trả lại lỗi nếu không được cung cấp.
  • trim (Boolean) Loại bỏ mọi khoảng trắng thừa.
  • uppercase (Boolean) Chuyển đổi thành chữ hoa.
  • lowercase (Boolean) Chuyển đổi thành chữ thường.
  • validate Đặt một hàm để xác định xem kết quả có được chấp nhận hay không.
  • default Đặt giá trị mặc định nếu không có dữ liệu nào được cung cấp.
./models/food.js
const mongoose = require('mongoose');

const FoodSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    trim: true,
    lowercase: true
  },
  calories: {
    type: Number,
    default: 0,
    validate(value) { 
      if (value < 0) throw new Error("Negative calories aren't real.");
    }
  },
});

const Food = mongoose.model("Food", FoodSchema);
module.exports = Food;

Hàm truy vấn

Mặc dù có nhiều hàm truy vấn có sẵn, bạn có thể tìm thấy ở đây , nhưng đây là những hàm ta sẽ sử dụng trong trường hợp này:

  • find() Trả về tất cả các đối tượng có tham số phù hợp để .find({ name: fish }) sẽ trả về mọi đối tượng có tên là fish và một đối tượng rỗng sẽ trả về mọi thứ.
  • save() Lưu nó vào database Atlas của ta .
  • findByIdAndDelete() Lấy id đối tượng và xóa khỏi database .
  • findByIdAndUpdate Lấy id đối tượng và một đối tượng để thay thế nó.
  • deleteOne()deleteMany() Xóa đầu tiên hoặc tất cả các mục khỏi database .

Đọc tất cả

Sau khi cài đặt mô hình dữ liệu, ta có thể bắt đầu cài đặt các tuyến cơ bản để sử dụng nó.

Ta sẽ bắt đầu bằng cách lấy tất cả các loại thực phẩm trong database , lúc này sẽ chỉ là một mảng trống. Vì các hàm Mongoose là không đồng bộ, ta sẽ sử dụng async/await .

Khi ta có dữ liệu, ta sẽ sử dụng khối try / catch để gửi nó trở lại và để ta có thể thấy rằng mọi thứ đang hoạt động bằng cách sử dụng Postman.

./routes/foodRoutes.js
const express = require('express');
const foodModel = require('../models/food');
const app = express();

app.get('/foods', async (req, res) => {
  const foods = await foodModel.find({});

  try {
    res.send(foods);
  } catch (err) {
    res.status(500).send(err);
  }
});

module.exports = app

Trong Postman, ta sẽ tạo một yêu cầu Get All mới, đặt url thành localhost:3000/foods và nhấn send. Nó sẽ thực hiện yêu cầu HTTP GET cho ta và trả về mảng trống của ta .

Tạo nên

Lần này, ta sẽ cài đặt một yêu cầu đăng đối với '/food' và ta sẽ tạo một đối tượng thực phẩm mới với mô hình của ta và chuyển nó dữ liệu yêu cầu từ Postman.

Khi ta có một mô hình với dữ liệu tại chỗ, ta có thể sử dụng .save() để lưu nó vào database của bạn .

app.post('/food', async (req, res) => {
  const food = new foodModel(req.body);

  try {
    await food.save();
    res.send(food);
  } catch (err) {
    res.status(500).send(err);
  }
});

Trong Postman, ta sẽ thực hiện một yêu cầu khác có tên là Thêm mới , cung cấp URL giống như trước đây cho localhost:3000/food và thay đổi nó từ yêu cầu GET thành POST.

Trong Body , chọn rawJSON (application / json) từ menu thả xuống. Tại đây, ta có thể thêm bất kỳ mặt hàng thực phẩm mới nào mà ta muốn lưu vào database của bạn .

{
  "name": "snails",
  "calories": "100"
}

Nếu bạn chạy lại yêu cầu Get All , mảng trống rỗng của ta bây giờ sẽ chứa đối tượng này.

Xóa bỏ

Mỗi đối tượng được tạo bằng Mongoose đều được cấp _id riêng và ta có thể sử dụng _id này để nhắm đến các mục cụ thể với yêu cầu DELETE . Ta có thể sử dụng phương thức .findByIdAndDelete() để dễ dàng xóa nó khỏi database , rõ ràng là nó chỉ cần id, được lưu trữ trên đối tượng yêu cầu của ta .

app.delete('/food/:id', async (req, res) => {
  try {
    const food = await foodModel.findByIdAndDelete(req.params.id)

    if (!food) res.status(404).send("No item found")
    res.status(200).send()
  } catch (err) {
    res.status(500).send(err)
  }
})

Trong Postman, ta có thể sử dụng yêu cầu Get All để lấy id của một trong các mục của ta và thêm id đó vào cuối url của ta trong yêu cầu Xóa mới của ta , nó sẽ giống như localhost:3000/food/5d1f6c3e4b0b88fb1d257237 .

Chạy Get All và nó sẽ không xuất hiện .

Cập nhật

Cũng giống như yêu cầu xóa, ta sẽ sử dụng _id để nhắm đến đúng mục. .findByIdAndUpdate() chỉ lấy id của mục tiêu và dữ liệu yêu cầu mà bạn muốn thay thế nó.

app.patch('/food/:id', async (req, res) => {
  try {
    await foodModel.findByIdAndUpdate(req.params.id, req.body)
    await foodModel.save()
    res.send(food)
  } catch (err) {
    res.status(500).send(err)
  }
})

Kết luận

Với các phương thức Mongoose, ta có thể nhanh chóng tạo và quản lý dữ liệu backend của bạn một cách dễ dàng. Mặc dù vẫn còn nhiều điều cần tìm hiểu, nhưng hy vọng phần giới thiệu nhỏ này sẽ giúp bạn có cái nhìn sâu sắc về Mongoose và giúp bạn quyết định xem đó có phải là công cụ phù hợp với bạn và các dự án tương lai của bạn hay không.


Tags:

Các tin liên quan