Simple CRUD example

175 views
Skip to first unread message

Eugene Prokopiev

unread,
Jan 11, 2018, 8:02:22 AM1/11/18
to tarantool-ru
Здравствуйте!

Попробовал написать простейший сервис, который сохраняет некий текст по ключу и достает его обратно:

[root@tarantool ~]# cat /etc/tarantool/instances.available/db.lua

#!/usr/bin/env tarantool

box.cfg{}

box.once('schema', function()
    box.schema.create_space('db')
    box.space.db:create_index('primary', { type = 'hash', parts = {1, 'string'} })
end)

local function save(req)
    local id = req:stash('id')
    box.space.db:upsert({ id, 1 }, {{ '=', 2, req.body }})
    return req:render{ json = box.space.db:select(id) }
end

local function load(req)
    local id = req:stash('id')
    return req:render{ json = box.space.db:select(id) }
end

local httpd = require('http.server')
local server = httpd.new('0', 8000)
server:route({ path = '/:id', method = 'POST' }, save)
server:route({ path = '/:id', method = 'GET'  }, load)
server:start()


Результаты довольно странные:

[root@tarantool ~]# tarantoolctl start db
Starting instance db...
Forwarding to 'systemctl start tarantool@db'
[root@tarantool ~]# curl -XPOST http://127.0.0.1:8000/1 -d 'XXX'
[["1",1]]
[root@tarantool ~]# curl http://127.0.0.1:8000/1        
[["1",1]]


Подскажите, в чем я ошибся? Как правильно получить и сохранить тело запроса?

Vladimir Lebedev

unread,
Jan 11, 2018, 10:24:55 AM1/11/18
to tarantool-ru
Привет!

Проблема, на самом деле в том, как вы сохраняете запрос. Вместо box.space.db:upsert({ id, 1 }, {{ '=', 2, req.body }}) надо использовать box.space.db:upsert({ id, req.body }, {{ '=', 2, req.body }}).

Иначе при первом POST в вашем варианте во второе поле в тапле всегда записывалась единица, а не тело запроса. Почитайте еще документацию на box.space:upsert().

Володя

Eugene Prokopiev

unread,
Jan 11, 2018, 1:19:11 PM1/11/18
to tarant...@googlegroups.com
И еще :read() вместо .body

Спасибо!

11 января 2018 г., 18:24 пользователь Vladimir Lebedev
<vale...@gmail.com> написал:
> --
> Вы получили это сообщение, поскольку подписаны на одну из тем в группе
> "tarantool-ru".
> Чтобы отменить подписку на эту тему, перейдите по ссылке
> https://groups.google.com/d/topic/tarantool-ru/qCOz60VqliQ/unsubscribe.
> Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на
> электронный адрес tarantool-ru...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.



--
WBR,
Eugene Prokopiev
Reply all
Reply to author
Forward
0 new messages