Рубрики
Без рубрики

Создание приложения с KOA и RETHINKDB

Несмотря на то, что изменения изменений лежат в основе функциональности в реальном времени Rethinkdb, вы можете пропустить эту функциональность, но использовать RETHINKDB только для хранения и запроса вашей базы данных, как MongoDB. Это то, что этот эксперимент предназначен для того, чтобы показать вам, как построить retful App Crud с KOA и RETHINKDB.

Автор оригинала: LAU TIAM KOK.

Вступление

Одна из ключевых причин, по которым вы хотите написать приложение с Коа Вероятно, вы хотите бросить обратные вызовы в вашем коде. Каскадирование промежуточного программного обеспечения в KOA – это хороший пример, как он позволяет настроить промежуточное программное обеспечение для выполнения одного за другим без каких-либо пресловутых обратных вызовов в JavaScript.

Screen Shot-2014-04-11-AT-7.49.09-AM.PNG

Когда промежуточное программное обеспечение вызывает Далее () Функция приостанавливает и проходит контроль до следующего промежуточного программного обеспечения. После того, как больше нет промежуточного программного обеспечения для выполнения вниз по течению, стек раскручивается, и каждое промежуточное программное обеспечение возобновляется для выполнения своего восходящего поведения. (Цитируется из http://koajs.com/)

Rethinkdb Является ли база данных с открытым исходным кодом JSON, созданная для веб-страницы в реальном времени. Он подталкивает JSON в ваши приложения в реальном времени из базы данных каждый раз, когда происходит изменение.

B_8exx3vaamdtg.png.png.png.png

RETHINKDB – первый открытый источник, масштабируемая база данных JSON, построенная с заземления для веб-страницы в реальном времени. Он инвертирует традиционную архитектуру базы данных, подвергая захватывающую новую модель доступа – вместо опроса для изменений разработчик может сообщить RETHINKB, чтобы постоянно толкать обновленные результаты запросов к приложениям в реальном времени. (Цитируется из https://www.rethincdb.com/faq/)

Несмотря на то, что изменение Лежит в основе функциональности в режиме реального времени Rethinkdb, вы можете пропустить эту функциональность, если хотите. Вы можете использовать RethinkDB, как Mongodb для хранения и запроса вашей базы данных. Это то, что эта статья намеревалась показать вам, как построить rethinkdb retful Crud с KOA и RETHINKDB.

Начиная

После наличия сервера RETHINKDB Установлен вам понадобится его Драйверы клиента Отказ К Установить Водитель с NPM для Nodejs:

$ npm install rethinkdb

Или вы можете включить его в качестве одного из зависимостей в Package.json Отказ У меня есть эта настройка в шахте:

  "dependencies": {
    "babel-cli": "^6.24.1",
    "babel-preset-es2015": "^6.24.1",
    "cross-env": "^5.0.1",
    "koa": "^2.3.0",
    "koa-bodyparser": "^4.2.0",
    "koa-favicon": "^2.0.0",
    "koa-static": "^4.0.1",
    "koa-trie-router": "^2.1.5",
    "rethinkdb": "^2.3.3"
  },
  "scripts": {
    "dev": "cross-env NODE_PATH=./server nodemon --exec babel-node --presets es2015 server/index.js",
    "start": "cross-env NODE_ENV=production NODE_PATH=./server nodemon --exec babel-node --presets es2015 server/index.js"
  },

Ради простоты мы поддерживаем весь основной код в Сервер/index.js Отказ Мы используем Babel-Node - Представления ES2015 Так что мы можем написать код ES6. Я установил Номемон Во всем мире, чтобы помочь мне перезапустить приложение каждый раз, когда происходит изменение во время разработки.

Чтобы запустить приложение, просто введите это в терминал:

$ npm start

Теперь мы можем начать использовать Rethinkdb Драйвер клиента в нашем приложении KOA:

import Koa from 'koa'
import Router from 'koa-trie-router'
import r from'rethinkdb'

Мы создадим эти 5 основных функций, GetUsers , GetUser , insertuser , insertuser , UseUser , Deleuseuser и пропустите их в роутере:

const router = new Router()
router
  .get('/users', getUsers)
  .get('/users/:name', getUser)
  .post('/users', insertUser)
  .put('/users', updateUser)
  .del('/users', deleteUser)

app.use(router.middleware())

До этого нам нужно будет создать функцию, чтобы установить соединение с базой данных RETHINKDB:

const db = async() => {
  const connection = await r.connect({
    host: 'localhost',
    port: '28015',
    db: 'mydb'
  })
  return connection;
}

Проблема для работы с RETHINKDB в настоящее время заключается в том, что ему не хватает дружественного администрирования. Веб-интерфейс Это поставляется по умолчанию, когда вы устанавливаете RETHINKDB, довольно простой и сложно использовать. Есть Сторонние инструменты администрирования , Замок самый простой среди многих на мой взгляд.

Разработка наших методов

Как только вы создали новую базу данных, например, MyDB Создайте новую таблицу под названием Пользователи В нем тогда мы можем катиться к HTTP-методам ниже:

1. метод получения

Давайте создадим GetUsers Способ запроса списка пользователей в MyDB :

const getUsers = async(ctx, next) => {
  await next()

  // Get the db connection.
  const connection = await db()

  // Check if a table exists.
  var exists = await r.tableList().contains('users').run(connection)
  if (exists === false) {
    ctx.throw(500, 'users table does not exist')
  }

  // Retrieve documents.
  var cursor = await r.table('users')
    .run(connection)

  var users = await cursor.toArray()

  ctx.type = 'json'
  ctx.body = users
}

Чтобы запросить один пользователь, давайте создадим GetUser Метод:

const getUser = async(ctx, next) => {
  await next()
  let name = ctx.params.name

  // Throw the error if no name.
  if (name === undefined) {
    ctx.throw(400, 'name is required')
  }

  // Get the db connection.
  const connection = await db()

  // Throw the error if the table does not exist.
  var exists = await r.tableList().contains('users').run(connection)
  if (exists === false) {
    ctx.throw(500, 'users table does not exist')
  }

  let searchQuery = {
    name: name
  }

  // Retrieve documents by filter.
  var user = await r.table('users')
    .filter(searchQuery)
    .nth(0) // query for a stream/array element by its position
    .default(null) // will return null if no user found.
    .run(connection)

  // Throw the error if no user found.
  if (user === null) {
    ctx.throw(400, 'no user found')
  }

  ctx.body = user
}

Когда вы посещаете приложение в http://127.0.0.1:3000/users , ты получаешь:

{"status":200,"data":[]}

Обратите внимание, что данные пусты – «Данные»: [] Это потому, что пользователь не добавлен в Пользователи Таблица еще.

2. Метод пост

Чтобы добавить новых пользователей в Пользователи Таблица в MyDB База данных, нам нужно создать insertuser Метод:

const insertUser = async(ctx, next) => {
  await next()

  // Get the db connection.
  const connection = await db()

  // Throw the error if the table does not exist.
  var exists = await r.tableList().contains('users').run(connection)
  if (exists === false) {
    ctx.throw(500, 'users table does not exist')
  }

  let body = ctx.request.body || {}

  // Throw the error if no name.
  if (body.name === undefined) {
    ctx.throw(400, 'name is required')
  }

  // Throw the error if no email.
  if (body.email === undefined) {
    ctx.throw(400, 'email is required')
  }

  let document = {
    name: body.name,
    email: body.email
  }

  var result = await r.table('users')
    .insert(document, {returnChanges: true})
    .run(connection)

  ctx.body = result
}

Теперь, если вы отправитесь в Google Postman, создайте ключи ниже и введите значение в Тело раздел:

Key     Value
--------------------
name    rob
email   foo@bar.co

Выберите Пост метод и ударить Отправить Кнопка, вы получаете:

{
    "status": 200,
    "data": {
        "changes": [
            {
                "new_val": {
                    "email": "foo@bar.co",
                    "id": "42feb7bc-333b-49a6-89cb-78c788de490c",
                    "name": "rob"
                },
                "old_val": null
            }
        ],
        "deleted": 0,
        "errors": 0,
        "generated_keys": [
            "42feb7bc-333b-49a6-89cb-78c788de490c"
        ],
        "inserted": 1,
        "replaced": 0,
        "skipped": 0,
        "unchanged": 0
    }
}

Когда вы посетите http://127.0.0.1:3000/users Опять же, вы получаете:

{"status":200,"data":[{"email":"foo@bar.co","id":"42feb7bc-333b-49a6-89cb-78c788de490c","name":"rob"}]}

Вы можете добавить больше пользователей в и когда вы просто хотите запрашивать один пользователь, например, http://127.0.0.1:3000/users/rob , ты получаешь:

{"status":200,"data":{"email":"foo@bar.co","id":"42feb7bc-333b-49a6-89cb-78c788de490c","name":"rob"}}

3. Метод положения

Чтобы обновить пользователя, нам нужно создать UseUser Метод:

const updateUser = async(ctx, next) => {
  await next()

  // Get the db connection.
  const connection = await db()

  // Throw the error if the table does not exist.
  var exists = await r.tableList().contains('users').run(connection)
  if (exists === false) {
    ctx.throw(500, 'users table does not exist')
  }

  let body = ctx.request.body || {}

  // Throw the error if no id.
  if (body.id === undefined) {
    ctx.throw(400, 'id is required')
  }

  // Throw the error if no name.
  if (body.name === undefined) {
    ctx.throw(400, 'name is required')
  }

  // Throw the error if no email.
  if (body.email === undefined) {
    ctx.throw(400, 'email is required')
  }

  let objectId = body.id
  let updateQuery = {
    name: body.name,
    email: body.email
  }

  // Update document by id.
  var result = await r.table('users')
    .get(objectId)
    .update(updateQuery, {returnChanges: true})
    .run(connection)

  ctx.body = result
}

Отпустите обратно в почтальон и обновите Роб Добавляя ID ключ к форме:

Key     Value
--------------------
name    rob
email   fooz@bar.co
id      42feb7bc-333b-49a6-89cb-78c788de490c

Когда вы ударили Отправить Кнопка с Поставить Метод, вы получаете:

{
    "status": 200,
    "data": {
        "changes": [
            {
                "new_val": {
                    "email": "fooz@bar.co",
                    "id": "42feb7bc-333b-49a6-89cb-78c788de490c",
                    "name": "rob"
                },
                "old_val": {
                    "email": "foo@bar.co",
                    "id": "42feb7bc-333b-49a6-89cb-78c788de490c",
                    "name": "rob"
                }
            }
        ],
        "deleted": 0,
        "errors": 0,
        "inserted": 0,
        "replaced": 1,
        "skipped": 0,
        "unchanged": 0
    }
}

4. Удалить метод

Наконец, чтобы удалить пользователя, мы создадим Deleuseuser Метод:

const deleteUser = async(ctx, next) => {
  await next()

  // Get the db connection.
  const connection = await db()

  // Throw the error if the table does not exist.
  var exists = await r.tableList().contains('users').run(connection)
  if (exists === false) {
    ctx.throw(500, 'users table does not exist')
  }

  let body = ctx.request.body || {}

  // Throw the error if no id.
  if (body.id === undefined) {
    ctx.throw(400, 'id is required')
  }

  let objectId = body.id

  // Delete a single document by id.
  var result = await r.table("users")
    .get(objectId)
    .delete()
    .run(connection)

  ctx.body = result
}

Нам просто нужно предоставить ID Ключ в почтовике, чтобы удалить Роб :

Key     Value
--------------------
id      42feb7bc-333b-49a6-89cb-78c788de490c

Когда вы ударили Отправить Кнопка с Удалить Метод, это результаты:

{
    "status": 200,
    "data": {
        "deleted": 1,
        "errors": 0,
        "inserted": 0,
        "replaced": 0,
        "skipped": 0,
        "unchanged": 0
    }
}

Если вы ищете Роб на http://127.0.0.1:3000/users/rob , вы должны получить:

{"status":400,"message":"no user found"}

Заключение

Вот и все. Мы завершили простое приложение с KOA и RETHINKDB! Вы можете клонировать или загрузить Источник от github. Дайте мне знать, что вы думаете, и если есть какие-либо предложения или улучшения, пожалуйста, оставьте комментарий ниже. Надеюсь, этот пример полезен, если вы когда-нибудь хотите разработать приложение KOA с RETHINKDB. Надеюсь, вы узнаете что-то новое, как я.