Как отображать полученные данные в Hexo с помощью плагина пользовательских тегов?

Я создаю онлайн-документацию на основе уценки, используя Hexo, но я хочу расширить ее возможности, отображая команды вывода сетевых устройств.

Чтобы быть более ясным, вместо того, чтобы копировать и вставлять команду и ее результат в кодовый блок, я хочу получить результат с помощью http перед рендерингом страницы.

Я уже запрограммировал программное обеспечение, отвечающее за выполнение нужной команды и предоставление ее результата на веб-сервере.

Все, что он делает, это отправляет строку, содержащую результат. Это просто текст.

Все, что я хочу, это отобразить этот результат на странице с помощью подключаемого модуля шестнадцатеричного тега.

Сейчас я действительно нахожусь на стадии разработки, поэтому использую только тему по умолчанию («пейзаж»). Поскольку я работаю над старой версией Arch Linux (4.19.8-arch1-1-ARCH), я использую Docker.

Файловая структура внутри контейнера:

.
|-- _config.yml
|-- package.json
|-- scaffolds
|   |-- draft.md
|   |-- page.md
|   `-- post.md
|-- scripts
|   `-- index.js
|-- source
|   `-- _posts
|       `-- hello-world.md
`-- themes

Докерфайл

FROM node:8.11.2

WORKDIR /gtd

ADD . .

RUN npm install hexo-cli -g
RUN npm install hexo-server --save
RUN npm install node-fetch --save
RUN npm install

CMD ["hexo", "server"]

Привет-мир.md

{% cli_exporter "output" "show_version" "some_router" %}

Пользовательский плагин (scripts/index.js)

const fetch = require("node-fetch");

hexo.extend.tag.register("cli_exporter", (args) => {
        const hostname = "XX.YYY.ZZZ.WW:XXXX"
        let endpoint, module, target
        [endpoint, module, target] = args 

        const url = "http://" + hostname + '/' + endpoint
                + "?module=" + module + "&target=" + target

        fetch(url)
        .then(response => {
                if (response.ok) {
                        return response.text()
                        .then(data => "<div>" + data + "</div>")
                        .catch(error => console.error(error))
                }
                return Promise.reject(new Error("response failed"))
        })
        .catch(error => Promise.reject(new Error(error.message)))
}, {async: true});

Я действительно не могу дать вам настоящее имя хоста, так как это частное программное обеспечение, но на самом деле это просто текст.

Допустим, я хочу получить результат show version от маршрутизатора Cisco. Если я console.log(data) в плагине, я получаю ожидаемый результат. Но это не отображается на сгенерированном веб-сайте.


person Gane D. Geoffrey    schedule 25.07.2019    source источник


Ответы (1)


Ну, я думаю, мой javascript немного заржавел. Я решил это, добавив return.

const fetch = require("node-fetch");

async function request(url) {
        const response = await fetch(url)
        const text = await response.text()

        return text
}

hexo.extend.tag.register("cli_exporter", (args) => {
        const hostname = "XX.YYY.ZZZ.WW:XXXX"
        let endpoint, module, target
        [endpoint, module, target] = args 

        const url = "http://" + hostname + '/' + endpoint
                + "?module=" + module + "&target=" + target

        return request(url)
        .then(data => {
                return "<div>" + data + "</div>"
        })
        .catch(error => console.error(error))
}, {async: true});
person Gane D. Geoffrey    schedule 26.07.2019