Nodejs 关于 Wiki, 写了点我的想法, 还有找个地方商量下细节不?

Nodejs 关于 Wiki, 写了点我的想法, 还有找个地方商量下细节不?

在github上建一个repo,用来存储wiki内容,大家的修改通过pull request提交回去。 设置一个POST回调,当内容有修改时,cnodejs收到回调通知就立刻去抓取回来,更新到网站上。 哇哈哈

5 回复

当然可以。根据你的描述,我们可以设计一个简单的系统来实现Wiki内容的存储、修改和同步。以下是一个基于Node.js和GitHub的简单实现方案。

系统架构

  1. GitHub Repo: 用于存储Wiki内容。
  2. Webhook: GitHub上的Webhook,用于触发内容修改的通知。
  3. 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}`);
});

解释

  1. Webhook Secret: 用于验证Webhook请求的来源。
  2. Express Server: 使用Express框架创建一个简单的HTTP服务器。
  3. Webhook Endpoint: 接收GitHub的POST请求,并验证签名。
  4. Fetch Content: 当分支是main时,从GitHub拉取最新的Markdown文件内容,并更新本地存储。

以上代码只是一个基本的示例,实际部署时还需要考虑更多的安全性和错误处理机制。希望这能帮助你开始构建自己的Wiki系统!


有 Repo 就要有专人维护, 以及 CNode 上要 Folk 出相应功能 老雷号召到人不?

目前的计划只能这样了… 晚上花点时间整理 Wiki, 与拖延症做斗争

就是 Github 上 repo 用的呀

根据你的描述,你希望使用 GitHub 存储 Wiki 内容,并通过 Pull Request 的方式来更新内容。同时,你希望在内容有修改时通过某种机制(例如 Webhook)触发更新操作。

以下是一种可能的实现方法:

实现步骤

  1. GitHub Repo 设置

    • 创建一个新的 GitHub 仓库,用于存储 Wiki 内容。
    • 将 Wiki 开启并将其内容初始化。
  2. Webhook 配置

    • 在 GitHub 仓库中配置 Webhook,当 Wiki 内容有变化时触发一个 POST 请求到你的服务器。
    • 配置 Webhook URL 为你的 Node.js 应用的一个特定路由,例如 /github-webhook
  3. 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}`);
});

解释

  1. GitHub 配置:创建一个 GitHub 仓库并开启 Wiki 功能。
  2. Webhook:在 GitHub 仓库中配置 Webhook,指向你的 Node.js 应用的 /github-webhook 路由。
  3. Node.js 服务:创建一个 Node.js 服务来接收 GitHub 的 Webhook 通知,并解析请求体中的内容,然后通过 API 获取 Wiki 内容并更新到你的网站上。

这样,每次 GitHub Wiki 内容有更新时,都会自动触发 Webhook,从而触发更新操作。

回到顶部