在React和Next.js中使用ArangoDB

2022-04-08 00:00:00 数据库 集合 代码 复制 创建一个


如今,开发人员可以处理现代应用程序中使用的复杂数据类型,而不必集成多个数据库;多模型数据库将不同数据库范式的优点结合在一起,如图、文档和关系数据库,并将其纳入一个程序。

在本教程中,我们将探讨ArangoDB,一个多模型的开源数据库,为文档、图和键值提供灵活的数据模型。我们将用React和Next.js构建我们的简单数据库应用。

与它的竞争者MongoDB、Fauna、DGraph和Neo4j一样,ArangoDB使用云端托管的数据库服务Oasis,这使得它可以轻松构建和扩展你的应用程序。

开始使用ArangoDB

首先,在cloud.rangodb.com上注册一个新的Oasis账户。在菜单上选择项目,创建一个新的ArangoDB项目;为了保持在ArangoDB的免费层,请确保坚持使用OneShard基本服务。

接下来,为你的项目选择一个名称,并选择你的云提供商和地区。当你的数据库被启动时,你需要等待几分钟。

要导航到你的网络仪表板,点击你的数据库URL旁边的图标。使用room 作为用户名和你的仪表板的密码登录。在用户下,创建一个新用户。后,转到数据库,创建一个测试数据库。

熟悉Arango查询语言

为了熟悉Arango查询语言(AQL),让我们创建一个新的例子集合,名为cheese 。前往查询部分,运行下面的代码,将数据插入到cheese 集合。

INSERT {name: "American"}
IN cheese

复制代码

继续前进,向cheese 集合添加一些项目。为了从cheese 集合中获取项目,运行下面的查询。

FOR c IN cheese
    RETURN c

复制代码

ArangoDB的语法是不言自明的,你可以在查询文档中看到额外的查询例子。

ArangoDB Node.js驱动程序

在将ArangoDB添加到我们的React和Next.js项目中之前,让我们回顾一下驱动程序在Node.js中是如何工作的。在撰写本文时,我使用的是Node.js v16.10。

创建一个名为arangotest 的新文件夹。在里面,运行下面的命令来创建一个新项目。

npm init -y

复制代码

安装ArangoDB的JavaScript驱动,如下所示。

npm install arangojs

复制代码

现在,创建一个index.js 文件。通过添加下面的代码建立数据库连接,但是,要确保它反映了你独特的数据库连接字符串。

const { Database, aql } = require("arangojs");

// establish database connection
const db = new Database({
  url: "https://XXXXXXXXXX.arangodb.cloud:8529/",
  databaseName: "XXXXXX",
  auth: { username: "XXXXXXX", password: "XXXXXX" },
});

复制代码

现在,我们将定义一个函数,在我们的数据库中创建一个新的集合,或者在集合已经存在的情况下防止错误发生。

下面的函数。

  • 接收一个集合名称作为参数
  • 获取一个当前在数据库中的所有集合的列表
  • 确定所需的集合是否已经存在
  • 如果集合不存在,则创建该集合
  • 返回该集合
// function to get collection or create it if it doesn't exist
    const getCollection = async (cName) => {
      // get list of collections in database
      const collections = await db.collections();
// check if collection exists, if so return collection, if not, create it if (collections.includes(cName)) { return await db.collection(cName); } else { return db.createCollection(cName); } };
复制代码

让我们尝试添加一个新的项目,cat ,到我们的集合中。下面的函数运行getCollection ,确保该集合存在。它还运行一个查询,通过插值传递name 参数。AQL标签处理并保护该函数免受注入攻击。

// create a new cat
const createCat = async (name) => {
    // make sure cat collection exists
    await getCollection("cats")
    // query to insert a cat
    await db.query(aql`INSERT {name: ${name}} IN cats`)
}
复制代码

现在,让我们运行一个可以查询结果的函数。AQL查询返回异步的ArrayCursor 对象。为了在数组中得到我们的结果,我们必须在查询游标上循环,并将结果推到数组中。

下面的函数检查集合是否存在,创建一个数组来存储结果,查询cats ,在arrayCursor 中循环,将每个cat 项目推入数组,并返回cats 的数组。

const getCats = async () => {
    // make sure cat collection exists
    await getCollection("cats")
    // declare array to hold cats
    let result = []
    // query for cats
    const results = await db.query(aql`FOR c IN cats RETURN c`)
    // loop through array cursor and push results in array
    for await (cat of results){
        result.push(cat)
    }
    // log results
    console.log(result)
    // return the list of cats
    return result
}

复制代码

这个项目的完整代码看起来像下面的代码块。

const { Database, aql } = require("arangojs");

// establish database connection
const db = new Database({
  url: "https://xxxxxxxxx.arangodb.cloud:8529/",
  databaseName: "xxxxxx",
  auth: { username: "xxxxxxx", password: "xxxxxxx" },
});

// function to get collection or create it if it doesn't exist
const getCollection = async (cName) => {
  // get list of collections in database
  const collections = await db.collections();

  // check if collection exists, if so return collection, if not, create it
  if (collections.find((c) => c._name === cName)) {
    return await db.collection(cName);
  } else {
    return db.createCollection(cName);
  }
};

// create a new cat
const createCat = async (name) => {
    // make sure cat collection exists
    await getCollection("cats")
    // query to insert a cat
    await db.query(aql`INSERT {name: ${name}} IN cats`)
}

// query cats

const getCats = async () => {
    // make sure cat collection exists
    await getCollection("cats")
    // declare array to hold cats
    let result = []
    // query for cats
    const results = await db.query(aql`FOR c IN cats RETURN c`)
    // loop through array cursor and push results in array
    for await (cat of results){
        result.push(cat)
    }
    // log results
    console.log(result)
    // return the list of cats
    return result
}

createCat("Miles")

getCats()

复制代码

在你运行这段代码几次后,你会发现每个项目都有几个属性,我们可以用它们作为的标识符。

  {
    _key: '10012443',
    _id: 'cats/10012443',
    _rev: '_dEUBD1---_',
    name: 'Miles'
  }

复制代码

在你的React应用程序中使用ArangoDB

你想避免在应用程序的前端暴露你的数据库凭证。要做到这一点,我们有几个选择,仍然可以让你使用你喜欢的前端框架。

其一,你可以用你喜欢的Node.js框架创建一个API,比如Express、Koa.js、Fastify、Sails.js、Loopback、FoalTS或NestJS。另外,你也可以使用无服务器函数,这在Vercel或Netlify中很容易。后,你可以使用任何与你选择的前端相匹配的同构框架。

  • React/ Next.js
  • Vue/ Nuxt.js
  • Svelte/ SvelteKit
  • Angular/ Angular Universal

现在,让我们使用Next.js创建一个API,从我们的React应用程序中访问ArangoDB。

设置您的 Next.js 应用程序

通过在终端运行以下命令,生成一个新的 Next.js 应用程序。

npm init next-app

复制代码

将该项目命名为arangoreact 。一旦项目完成生成,CD ,并安装arangojs

npm install arangojs

复制代码

创建一个名为utils 的文件夹;在里面,创建一个名为db.js 的文件。让我们把我们的连接代码包在自己的函数中,这样我们就可以根据需要进行连接。

const { Database, aql } = require("arangojs");

const getConnection = () => {
  // establish database connection
  return new Database({
    url: "https://5e5b9f99f7e1.arangodb.cloud:8529/",
    databaseName: "test",
    auth: { username: "testuser", password: "test" },
  });
};

复制代码

现在,我们将复制我们的getCollection 函数,并修改它,使其接收连接作为一个参数。

// function to get collection or create it if it doesn't exist
const getCollection = async (cName, db) => {
  // get list of collections in database
  const collections = await db.collections();

  // check if collection exists, if so return collection, if not, create it
  if (collections.find((c) => c._name === cName)) {
    return await db.collection(cName);
  } else {
    return db.createCollection(cName);
  }
};

复制代码

接下来,我们将让我们的函数查询cats ,然后导出它,这样我们就可以在API路由中使用它。请注意,我们更新了该函数,以便在其中建立连接。

// query cats

export const getCats = async () => {
  // make connection
  const db = getConnection()
  // make sure cat collection exists
  await getCollection("cats", db);
  // declare array to hold cats
  let result = [];
  // query for cats
  const results = await db.query(aql`FOR c IN cats RETURN c`);
  // loop through array cursor and push results in array
  for await (let cat of results) {
    result.push(cat);
  }
  // log results
  console.log(result);
  // return the list of cats
  return result;
};

复制代码

在Next.js中创建我们的API路由

pages/api 中创建一个文件,称为cats.js

import { getCats } from "../../utils/db";

export default async function (req, res){

    const cats = await getCats()
    console.log(cats)
    res.json(cats)

}

复制代码

localhost:3000/api/cats 现在,你应该可以打开Next.js的开发服务器npm run dev ,然后通过从Postman或Insomnia等平台向GET ,测试API。

从React组件中获取数据

在这一点上,数据是通过一个标准的API端点交付的。我们将使用从API获取数据的标准做法。

首先,我们将用useState Hook声明状态来保存API数据。接下来,我们将声明一个函数,用fetch 请求数据并更新状态。我们将在useEffect Hook中调用这个函数,这样在页面加载时只发生一次。

pages/index.js 中添加下面的代码。

import {useState, useEffect} from "react"

export default function index (){

  // create the state
  const [cats, setCats] = useState([])

  // function to request cats and update state
  const fetchCats = async () => {
    const response = await fetch("/api/cats")
    const data = await response.json()
    setCats(data)
  }

  // call the function on page load with useEffect
  useEffect(() => fetchCats(), [])

  // return JSX using cats data

  return <div>
    {cats.map(cat => (
      <ul>
        {Object.keys(cat).map(key => (
          <li>{key}: {cat[key]}</li>
        ))}
      </ul>
    ))}
  </div>
}

复制代码

现在,如果你访问localhost:3000 ,你会看到我们所有的cats 列在页面上。我们刚刚成功地将数据从ArangoDB数据库拉到我们的React应用程序中。

总结

多模型数据库对于改善和组织复杂的数据库来说,是一种游戏规则的改变。在本教程中,我们用React和Next.js探索了ArangoDB。首先,我们通过一个简单的例子熟悉了Arango查询语言,然后我们学习了如何从在线ArangoDB仪表板和Node.js驱动中工作。

ArangoDB是在你的React应用程序中处理广泛的、复杂的数据库的一个伟大选择。它的使用相当简单,通过结合图、文档和关系型数据库的功能,为数据映射提供了一个简单的解决方案。我希望你喜欢这个教程

The postUsing ArangoDB with React and Next.jsappeared first onLogRocket Blog.

相关文章