Định nghĩa các hàm get single post, update và delete post
Các hàm get single post, update và delete post có thể được định nghĩa rất tương tự với hàm list posts. Hãy làm
cái đó nhanh bây giờ:
1. Biên tập src/services/posts.js file và định nghĩa một hàm getPostById như sau:
export async function getPostById(postId) {
return await Post.findById(postId)
}
Nó có thể dường như lặt vặt để định nghĩa một hàm dịch vụ cái chính gọi Post.findById, nhưng nó là thực hành tốt
để định nghĩa nó tiện thể. Sau này, chúng ta có thể muốn thêm một vài hạn chế thêm, như kiểm soát truy cập. Có
hàm dịch vụ cho phép chúng ta thay đổi nó chỉ trong một nơi và chúng ta không phải lo lắng về quên thêm nó nơi
nào đó. Lợi ích khác là rằng nếu chúng ta, ví dụ, muốn thay đổi nhà cung cấp CSDL sau này, nhà phát triển chỉ
cần lo lắng về nhận các hàm dịch vụ làm việc lại một lần nữa, và chúng có thể được thẩm định với các test cases.
2. Trong cùng file, định nghĩa hàm updatePost. Nó sẽ lấy một ID của một post hiện tại, và một object các tham số
sẽ được cập nhật. Chúng ta sẽ sử dụng hàm findOneAndUpdate từ Mongoose, cùng với toán tử $set, để thay đổi các
tham số chỉ ra. Như một đối số thứ ba, chúng ta cung cấp một object tùy chọn với new:true để rằng hàm trả về object
điều chỉnh thay vì cái gốc:
export async function updatePost(postId, { title, author,
contents, tags }) {return await Post.findOneAndUpdate(
{ _id: postId },
{ $set: { title, author, contents, tags } },
{ new: true },)
}
3. Trong cùng file, cũng định nghĩa một hàm deletePost, cái đơn giản lấy ID của post hiện tại và xóa nó từ CSDL:
export async function deletePost(postId) {
return await Post.deleteOne({ _id: postId })
}
Tip
Phụ thuộc vào ứng dụng của bạn, bạn có thể muốn thiết lập timestamp deletedOn thay vì xóa nó ngay. Sau đó, thiết
lập một hàm cái nhận tất cả tài liệu cái vừa bị xóa trong hơn 30 ngày và xóa chúng. Tất nhiên, cái này có nghĩa
rằng chúng ta cần luôn lọc ra các posts bị xóa xong trong hàm listPosts và rằng chúng ta cần viết các test cases
cho hành vi này!
4. Biên tập src/__tests__/posts.js file và nhập khẩu hàm getPostById:
getPostById,
} from ‘../services/posts.js’
5. Thêm các tests cho nhận một post theo ID và thất bại để nhận một post vì ID không tồn tại trong CSDL:
describe(‘getting a post’, () => {
test(‘should return the full post’, async () => {
const post = await getPostById(createdSamplePosts[0]._id)
expect(post.toObject()).toEqual(createdSamplePosts[0].toObject())
})
test(‘should fail if the id does not exist’, async () => {
const post = await getPostById(‘000000000000000000000000’)
expect(post).toEqual(null)})
})
Trong test đầu tiên, chúng ta sử dụng .toObject() để chuyển đổi Mongoose object với tất cả các đặc tính nội bộ và
metadata thành một plain old JavaScript object (POJO) để rằng chúng ta có thể so sánh nó với object post mẫu bằng
cách so sánh tất cả đặc tính.
