Nodejs 关于 Wiki, 写了点我的想法, 还有找个地方商量下细节不?
Nodejs 关于 Wiki, 写了点我的想法, 还有找个地方商量下细节不?
在github上建一个repo,用来存储wiki内容,大家的修改通过pull request提交回去。 设置一个POST回调,当内容有修改时,cnodejs收到回调通知就立刻去抓取回来,更新到网站上。 哇哈哈
当然可以。根据你的描述,我们可以设计一个简单的系统来实现Wiki内容的存储、修改和同步。以下是一个基于Node.js和GitHub的简单实现方案。
系统架构
- GitHub Repo: 用于存储Wiki内容。
- Webhook: GitHub上的Webhook,用于触发内容修改的通知。
- Node.js服务器: 用于接收GitHub的Webhook通知,并处理内容的同步。
示例代码
1. 创建GitHub Repo
首先,在GitHub上创建一个新的Repository,命名为wiki-content
。在这个Repo中,你可以初始化一些初始的Markdown文件作为Wiki内容。
2. 设置GitHub Webhook
在GitHub Repo的Settings中,添加一个Webhook,配置为当Push事件发生时发送POST请求到你的Node.js服务器。确保你已经有一个公开的URL可以接收这些POST请求。
3. Node.js服务器代码
const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());
// GitHub webhook secret (for security)
const webhookSecret = 'your-webhook-secret';
// Endpoint to receive webhook notifications
app.post('/webhook', (req, res) => {
const signature = req.headers['x-hub-signature-256'];
// Verify the webhook signature
if (!verifySignature(req.body, signature, webhookSecret)) {
return res.status(401).send('Unauthorized');
}
// Extract the repository name and branch from the payload
const repoName = req.body.repository.name;
const ref = req.body.ref;
if (ref === 'refs/heads/main') { // Assuming main branch
// Fetch the updated content from GitHub
axios.get(`https://raw.githubusercontent.com/${repoName}/main/wiki.md`)
.then(response => {
// Update your local wiki content here
console.log('Updated local wiki content:', response.data);
res.send('Content updated successfully');
})
.catch(error => {
console.error('Error fetching content:', error);
res.status(500).send('Failed to update content');
});
} else {
res.send('Branch is not main, no action taken');
}
});
function verifySignature(payload, signature, secret) {
const hmac = crypto.createHmac('sha256', secret);
const digest = hmac.update(JSON.stringify(payload)).digest('hex');
return `sha256=${digest}` === signature;
}
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
解释
- Webhook Secret: 用于验证Webhook请求的来源。
- Express Server: 使用Express框架创建一个简单的HTTP服务器。
- Webhook Endpoint: 接收GitHub的POST请求,并验证签名。
- Fetch Content: 当分支是
main
时,从GitHub拉取最新的Markdown文件内容,并更新本地存储。
以上代码只是一个基本的示例,实际部署时还需要考虑更多的安全性和错误处理机制。希望这能帮助你开始构建自己的Wiki系统!
有 Repo 就要有专人维护, 以及 CNode 上要 Folk 出相应功能 老雷号召到人不?
目前的计划只能这样了… 晚上花点时间整理 Wiki, 与拖延症做斗争
就是 Github 上 repo 用的呀
根据你的描述,你希望使用 GitHub 存储 Wiki 内容,并通过 Pull Request 的方式来更新内容。同时,你希望在内容有修改时通过某种机制(例如 Webhook)触发更新操作。
以下是一种可能的实现方法:
实现步骤
-
GitHub Repo 设置
- 创建一个新的 GitHub 仓库,用于存储 Wiki 内容。
- 将 Wiki 开启并将其内容初始化。
-
Webhook 配置
- 在 GitHub 仓库中配置 Webhook,当 Wiki 内容有变化时触发一个 POST 请求到你的服务器。
- 配置 Webhook URL 为你的 Node.js 应用的一个特定路由,例如
/github-webhook
。
-
Node.js 服务
- 创建一个 Node.js 服务来接收 Webhook 通知,并处理更新 Wiki 内容的操作。
示例代码
const express = require('express');
const axios = require('axios');
const app = express();
// 解析请求体
app.use(express.json());
// 定义 GitHub webhook 接收路由
app.post('/github-webhook', async (req, res) => {
try {
// 检查来自 GitHub 的有效签名
const signature = req.headers['x-hub-signature-256'];
const secret = process.env.GITHUB_SECRET;
if (!signature || !secret) {
return res.status(400).send('Invalid request');
}
const expectedSignature = `sha256=${require('crypto').createHmac('sha256', secret)
.update(JSON.stringify(req.body))
.digest('hex')}`;
if (signature !== expectedSignature) {
return res.status(400).send('Invalid signature');
}
// 获取 Wiki 内容
const wikiUrl = 'https://api.github.com/repos/{username}/{repo}/contents/{path}';
const response = await axios.get(wikiUrl, {
headers: {
Authorization: `token ${process.env.GITHUB_TOKEN}`
}
});
// 更新你的网站上的 Wiki 内容
const wikiContent = Buffer.from(response.data.content, 'base64').toString();
updateWikiOnWebsite(wikiContent);
res.status(200).send('Wiki content updated successfully');
} catch (error) {
console.error(error);
res.status(500).send('Error updating wiki content');
}
});
function updateWikiOnWebsite(content) {
// 实现更新网站上的 Wiki 内容的具体逻辑
// 这里假设有一个简单的函数来更新网站上的内容
}
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
解释
- GitHub 配置:创建一个 GitHub 仓库并开启 Wiki 功能。
- Webhook:在 GitHub 仓库中配置 Webhook,指向你的 Node.js 应用的
/github-webhook
路由。 - Node.js 服务:创建一个 Node.js 服务来接收 GitHub 的 Webhook 通知,并解析请求体中的内容,然后通过 API 获取 Wiki 内容并更新到你的网站上。
这样,每次 GitHub Wiki 内容有更新时,都会自动触发 Webhook,从而触发更新操作。