Cache MongoDB connection khi làm việc với Next.js

Để kết nối với MongoDB, thông thường ta sẽ làm như sau:

const { MongoClient } = require('mongodb')
// Connection URI
const uri = 'mongodb://127.0.0.1:27017'
// Create a new MongoClient

async function connectDb() {
  try {
    const client = new MongoClient(uri)
    await client.connect()
    const db = client.db('database_name')
    console.log('Connected successfully to server')
    return db
  } catch (err) {
    console.error(err)
    throw Error(err)
  }
}

Khi dùng Next.js (hay React nói chung) tôi thường dùng Typescript, vì vậy nó có thể viết lại kiểu:

import { Db, MongoClient } from 'mongodb'

const MONGO_URI = 'mongodb://127.0.0.1:27017'

export async function connectDb(): Promise<Db> {
  const client: MongoClient = new MongoClient(MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  } as any)
  await client.connect()
  return client.db('database_name')
}

Sau đó, để sử dụng trong API Routes của Next.js ta import vào và dùng như bình thường:

import type { NextApiRequest, NextApiResponse } from 'next'
import { connectDb } from '../../lib/database'

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  try {
    await connectDb()
    res.status(200).json({ message: 'Connection successful!' })
  } catch(err) {
    res.status(500).json({ name: 'Failedddddd' })
  }
}

Mở terminal, gõ yarn dev để start server:
alt text

alt text

Lúc này, MongoDB chưa kết nối (do chưa gọi API). Trong MongoDB, để kiểm tra thông tin về số lượng kết nối, ta dùng lệnh db.serverStatus().connections như sau:
alt text

Ta có thể thấy đang có 4 kết nối tới Database (không cần quan tâm). Giờ ta sẽ thử gọi api và kiểm tra lại số lượng kết nối:
alt text

alt text

Gọi đến API này liên tục, kiểm tra lượng kết nối trên MongoDB sẽ thấy current connections tăng lên liên tục, bằng với số lần gọi:

alt text

Tất nhiên là ta sẽ không muốn cứ có một request đến thì lại có một connection được mở ra. Để giải quyết việc này, ta sẽ lưu connection đến mongo vào global, sau đó kiểm tra xem nó đã tồn tại chưa, nếu chưa thì mới connect:

import { Db, MongoClient } from 'mongodb'

const MONGO_URI = 'mongodb://127.0.0.1:27017'

declare global {
  var mongo: any
}
let cached = global.mongo
if (!cached) {
  cached = global.mongo = { conn: null }
}

export async function connectDb(): Promise<Db> {
  if (cached.conn) return cached.conn
  const client: MongoClient = new MongoClient(MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  } as any)
  await client.connect()
  cached.conn = client.db('ask')
  return cached.conn
}

Bài viết đăng lại từ blog: Cache MongoDB connection khi làm việc với Next.js

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Thành Minh

8 bài viết.
49 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
42 25
1. Các thư viện cần dùng Thư viện (Link) để xử lí file Zip. Thư viện (Link) để xử lí file Rar. Thư viện (Link), thư viện rarfile bắt buộc đi kèm...
Thành Minh viết hơn 4 năm trước
42 25
White
31 3
V8 hay còn gọi là Chrome V8, là một Javascript engine được phát triển bởi Chromium Project, mục đích ban đầu là dành cho Google Chrome nói riêng và...
Thành Minh viết gần 4 năm trước
31 3
White
8 2
Mỗi năm thì lại có một bản ECMAScript được thêm vào, cùng với đó là thêm kha khá tính năng mới, bài viết này sẽ kể đến một vài tính năng nhỏ nhưng ...
Thành Minh viết hơn 3 năm trước
8 2
Bài viết liên quan
White
6 2
Chào các bạn Mình vừa mới làm một side project để cập nhật công nghệ mới nhất về React stack. Shopping Cart của mình được build bằng TypeScript, N...
Đinh Viễn viết hơn 2 năm trước
6 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
8 bài viết.
49 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!