Введение:
MongoDB: MongoDB — это кроссплатформенная программа для работы с базами данных, ориентированная на работу с документами. MongoDB классифицируется как программа базы данных NoSQL и использует JSON-подобные документы со схемой.
NodeJS.Node.js — это кроссплатформенная среда выполнения JavaScript с открытым исходным кодом, которая выполняет код JavaScript вне браузера.
ReactJS.React — это библиотека JavaScript для создания пользовательских интерфейсов. Он поддерживается Facebook и сообществом отдельных разработчиков и компаний. React можно использовать в качестве базы при разработке одностраничных или мобильных приложений, так как он оптимален для получения быстро меняющихся данных, которые необходимо записывать.
В этом руководстве мы создадим образец сервера NodeJS, который получит список участников OpenEBS (через API Github) и преобразует их образ в base64, а затем сохранит его в MongoDB и покажет список участников в приложении Reactjs.
Это можно использовать в качестве ссылки для хранения изображения в MongoDB. В этом блоге я буду использовать NodeJ, но вы можете использовать любой язык для достижения этой цели.
Необходимое условие:
MongoDB: для хранения сведений об авторе.
NodeJs: создайте код на стороне сервера. и такие пакеты, как Mongoose, express.
Внешний интерфейс:небольшие знания о внешнем стеке. Я собираюсь использовать ReactJS в качестве фреймворка FrontEnd.
Давайте начнем с моего загрузочного кода Nodejs на стороне сервера, где мы уже написали конфигурацию сервера и небольшой пользовательский интерфейс с приветствием, мир.
Directory structure of project
Как видите, у нас есть все базовые настройки начальной загрузки для приложений Nodejs и Reactjs.
вы можете получить приведенный выше начальный код начальной загрузки отсюда
https://github.com/inyee786/base64ImageStore/tree/85b18cd1e0cb83ae419b31783a65461b80e89980
В этом руководстве мы собираемся хранить сведения о первых 100 участниках OpenEBS в MongoDB, которая содержит сведения о пользователях и их изображения, и в приложении Reactjs, где мы покажем список пользователей.
GithubContribuotrs: создайте файл server/githubContibutors.js и импортируйте основные пакеты в начало файла.
const mongo = require('../config/dbconnection'); const request = require('request'); const express = require('express');
Давайте начнем с создания схемы MongoDB участника GitHub.
const contributorSchema = new mongo.Schema({ login: String, githubID: { type: Number, required: true, unique: true }, contentType: String, image: { base64: String, imageFormat: String } }); const Contributor = mongo.model('contributors', contributorSchema);
Функция для получения списка участников
let baseUrl = "https://api.github.com/"; function getListOfContibutors() { let options = { url: `${baseUrl}repos/openebs/openebs/contributors?per_page=100`, headers: { ' User-Agent': 'request' } }; return new Promise(function (resolve, reject) { request.get(options, function (err, resp, body) { if (err) { reject(err); } else { resolve(body); } }) }) }
позвольте преобразовать все изображение в изображение base64
function getImage(avtarurl) { const options = { url: `${avtarurl}&&s=100`, encoding: 'base64' }; return new Promise(function (resolve, reject) { request.get(options, function (err, resp, body) { if (err) { reject(err); } else { const userDetails = { contentType: resp.headers['content-type'], image: { imageFormat: resp.headers['content-type'].split('/')[1], base64: resp.body } } resolve(userDetails); } }) }) }
Теперь настал захватывающий этап, когда мы вызовем две функции и сохраним изображение в MongoDB.
async function main() { const listOfContributors = JSON.parse(await getListOfContibutors()); const userDetailsPromise = listOfContributors.map(async (user) => { const getImageDetails = await getImage(user.avatar_url); return { login: user.login, githubID: user.id, ...getImageDetails } }) const userDetails = await Promise.all(userDetailsPromise); Contributor.insertMany(userDetails) .then(function (docs) { console.log("Data inserted successfully") }) .catch(function (err) { console.log(err) }); }
давайте создадим конечную точку RestAPI, через которую мы можем запросить MongoDB, чтобы получить список участников Github.
router.get('/contributors', (req, res) => { Contributor.find({}, 'login githubID image.base64 image.contentType -_id', (err, users) => { if (err) res.status(500).send(err) res.status(200).json(users); }); });
Поскольку я не хочу отправлять все сведения об участниках из коллекции участников MongoDB, мы отправим только некоторые сведения из коллекций.
После этого нам нужно импортировать указанный выше маршрут в файл index.js.
добавьте это в файл index.js
const github = require('./routes/githubContibutors') app.use('/api',github)
Теперь наша конечная точка готова к использованию
посетите этот http://localhost:3001/api/contributors, эта конечная точка будет перечислять 100 участников Openebs
До сих пор мы успешно сохраняли информацию об участнике и изображение (base64 [кодировка]) внутри MongoDB и создавали конечную точку REST API, которая используется нашим приложением ReactJS.
ReactJS: если вы продвигаетесь вперед, я предполагаю, что у вас есть базовые знания о ReatJ.
Вот как я создал базовую структуру проекта Reactjs, а ниже приведены подробные сведения о компонентах.
Заголовок: common/Header.js Это фиктивный компонент с жестко закодированным текстом.
import React from 'react' function Header() { return ( <div> <h1>OpenEBS 100 contributors</h1> </div> )} export default Header;
ContributorCard: components/ContributorCard.js Это наименьший компонент, в котором мы показываем сведения об авторе и показываем изображение, закодированное в base64.
import React from 'react' import Card from 'react-bootstrap/Card'; export default function ContributorCard(props) { const { login, image: { base64, imageFormat } } = props.contributor; return (<Card style={{ width: '8rem' }}> <Card.Img variant="top" style={{borderRadius : '50%'}} src={`data:image/${imageFormat};base64,${base64}`} /> <Card.Body> <Card.Title>{login}</Card.Title> </Card.Body> </Card> ) }
ListOfContributors: components/ListOfContributors.js В этом компоненте мы перечислим участников и вызовем конечную точку RestApi.
import React, { Component } from 'react' import axios from 'axios'; import ContributorCard from './ContributorCard' export class ListOfContributors extends Component { constructor(props) { super(props); this.state = { contributors: [] } } async componentWillMount() { const contributors = await axios.get('/api/contributors').then(res => res.data); this.setState({ contributors: contributors }) } render() { return (<div className="d-flex flex-wrap"> { this.state.contributors.map(contributor => (<ContributorCard key={contributor.githubID} contributor={contributor} />))} </div>) } } export default ListOfContributors;
давайте импортируем компоненты Header и ListOfContributors в файл app.js.
import React from 'react'; import './App.css'; import 'bootstrap/dist/css/bootstrap.min.css'; import ListOfContributors from './components/ListOfContributors'; import Header from './common/Header' function App() { return ( <div className="App"> <Header /> <ListOfContributors /> </div> ); } export default App;
и теперь наше приложение готово к работе, посетите localhost:3000, вы увидите результат ниже.
Обо мне:
Вы можете следить за мной в указанных ниже профилях и задавать любые вопросы, связанные с Angular, SPA, JavaScript, Kubernetes и т. д.