Автор оригинала: LAU TIAM KOK.
Вступление
Одна из ключевых причин, по которым вы хотите написать приложение с Коа Вероятно, вы хотите бросить обратные вызовы в вашем коде. Каскадирование промежуточного программного обеспечения в KOA – это хороший пример, как он позволяет настроить промежуточное программное обеспечение для выполнения одного за другим без каких-либо пресловутых обратных вызовов в JavaScript.
Когда промежуточное программное обеспечение вызывает Далее ()
Функция приостанавливает и проходит контроль до следующего промежуточного программного обеспечения. После того, как больше нет промежуточного программного обеспечения для выполнения вниз по течению, стек раскручивается, и каждое промежуточное программное обеспечение возобновляется для выполнения своего восходящего поведения. (Цитируется из http://koajs.com/)
Rethinkdb Является ли база данных с открытым исходным кодом JSON, созданная для веб-страницы в реальном времени. Он подталкивает JSON в ваши приложения в реальном времени из базы данных каждый раз, когда происходит изменение.
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. Надеюсь, вы узнаете что-то новое, как я.