Netlify Serverless Functions + GitHub를 사용하여 Gatsby에 주석 추가
comments.json
라는 파일로 바로 들어가길 원했습니다. 그래서 나는 다음과 같이 간단한 것을 사용할 수 있습니다.import comments from "../comments.json"
내 사이트의 코드에서. 데이터베이스가 없습니다. 수십 개의 네트워크 요청을 하는 타사 플러그인이 없습니다.
Netlify serverless functions 덕분에 GitHub의 API를 사용하여 제출된 댓글의 데이터로 이 저장소를 변경할 수 있었습니다. 또한 내 비밀 API 자격 증명을 숨겼습니다.
이 흐름을 사용하는 프로토타입(healeycodes/gatsby-serverless-comments)을 만들었습니다.
comments.json
을 읽고 새로운 댓글을 추가하여 저장합니다. 새 댓글은 첫 번째 클릭 후 ~30초 ⏰에 사용자에게 표시됩니다.
서버리스 기능
사용자의 댓글을 받는 서버리스 기능을 통해 픽해보자. 설정 → 배포에서 Netlify의 웹사이트를 통해 설정할 수 있는 일부 상수를 사용합니다.
이 함수는 Node.js로 작성되었으며 Netlify's documentation에 설명된
handler
함수를 내보냅니다.// comment.js
const fetch = require("node-fetch")
const auth = process.env.GITHUB_PAT_TOKEN
const repo = process.env.GITHUB_REPO
const user = process.env.GITHUB_USER
const api =
"https://api.github.com/repos/" +
user +
"/" +
repo +
"/contents/src/comments.json"
exports.handler = async function(event, context, callback) {
// Use the Contents API from GitHub
// https://developer.github.com/v3/repos/contents/#get-contents
const existingFile = JSON.parse(
await fetch(api, {
headers: {
// Pass some kind of authorization
// I'm using a personal access token
Authorization:
"Basic " + Buffer.from(user + ":" + auth)
.toString("base64"),
},
}).then(res => res.text())
)
// The file's content is stored in base64 encoding
// Decode that into utf-8 and then parse into an object
let comments = JSON.parse(
Buffer.from(existingFile.content, "base64").toString("utf-8")
)
// This is the user submitted comment
// Perhaps we would do some validation here
const newComment = JSON.parse(event.body)
// Update the comments
comments.push({
author: newComment.author,
email: newComment.email,
message: newComment.message,
date: Date.now(),
})
// Use the Contents API to save the changes
const res = await fetch(api, {
method: "PUT",
headers: {
Authorization:
"Basic " + Buffer.from(user + ":" + auth).toString("base64"),
},
body: JSON.stringify({
message: "New comment on " + new Date().toDateString(),
// Turn that object back into a string and encoded it
content: Buffer(JSON.stringify(comments)).toString("base64"),
// Required: the blob SHA of the existing file
sha: existingFile.sha,
}),
}).then(res => res.text())
callback(null, {
statusCode: 204,
})
}
잠재적인 단점
누군가 귀하의 웹사이트에 스팸 댓글을 달면 어떻게 됩니까? 글쎄, 당신은 당신의 빌드 시간 제한에 매우 빨리 도달할 것입니다.
또한 두 사람이 동시에 댓글을 달고 이전 댓글을 덮어쓰는 작은 창(API 호출 사이의 10-100밀리초)도 있습니다.
이 두 가지에 대한 수정은 서버리스 기능을 변경하여 의견 변경으로 풀 요청을 여는 것입니다. 이제 댓글이 지연되지만 악의적인 행동으로부터 스스로를 보호하고 적절성을 위해 댓글을 걸러낼 수도 있습니다. 데이터 손실은 없지만 병합 충돌을 처리할 필요가 거의 없습니다.
내 Netlify 리뷰
Netlify는 Jamstack 애플리케이션에 큰 돈을 걸고 있습니다. 나도 할 내기다.
그들의 개발자 경험(DX)은 현재 최고입니다. 제대로 작동하는 제품에 대해 읽은 다음 그렇게 되는 경우는 드뭅니다! 최근에 Netlify의 빠른 배포 덕분에 변경 사항을 서둘러 실행하여 몇 분 안에 문제를 해결할 수 있었습니다.
이것은 미래의 성공에 어떤 의미가 있습니까? 음, Tiny.cloudpoints out는 다음과 같습니다.
DX is kind of a big deal. Developers can play a huge role in the uptake of your product, especially when you consider they are likely to provide guidance on what tools their organization should invest in, even though the final decision usually happens at the executive level.
Netlify의 개발자 도구를 사용하면 구성을 망칠 필요 없이 지금 읽고 있는 것과 같은 프로토타입을 만들 수 있습니다. My Gatsby website은 넉넉한 무료 계층으로 호스팅되며 전송 및 호스팅은 딸꾹질이 없었습니다.
나는 그들을 추천합니다.
코드 및 개인 성장에 대해 내newsletter에 가입한 300명 이상의 사람들과 함께하세요!
기술에 대해 트윗합니다.
Reference
이 문제에 관하여(Netlify Serverless Functions + GitHub를 사용하여 Gatsby에 주석 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/healeycodes/adding-comments-to-gatsby-with-netlify-serverless-functions-github-58ch텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)