你的基本CRUD:一个简单的塔兰托尔网络应用(塔兰托尔101,4A指南)


Tarantool驱动着世界上一些最大的堆栈,但它能为一个简单的Web应用程序做些什么呢?首先,它可能是您可以选择的最快的选项,无论是在原始速度方面,因为它是基于RAM的,而且在开发时间方面也是如此-因为它是您需要添加到服务器上的唯一技术(包括应用程序服务器和数据库)。此外,Tarantool生态系统还负责其他您可能需要外包的工具。例如,您不需要单独的工具来保持Tarantool的存活状态,因为Tarantool随附了便携的Tarantoolctl

我们将制作一个经典的“TODO”应用程序,它允许您创建任务(“创建”)、列出任务(“读取”)、编辑任务(“更新”)和删除任务(“删除”)。本文将分为两部分,第一部分介绍“创建”和“读取”,第二部分介绍“更新”和“删除”。它是独立存在的,但是您可能会发现参考Tarantool 101会很有帮助Guide 1 或者Guide 2。另外,请注意,我正在使用一台运行Ubuntu16.04的数字海洋服务器。最后,您可以看到应用程序的代码here和一个演示here

好了,我们开始吧。

首先从复制并粘贴整个脚本here安装Tarantool 1.9(选择“Xenial”)。

接下来,我们将使用cmake为我们的服务器安装Tarantool HTTP模块:

git clone https://github.com/tarantool/http.git
cd http && cmake . -DCMAKE_BUILD_TYPE=RelWithDebugInfo
make
make install

正如我们在Tarantool 101指南2中所讨论的,习惯上将Tarantool应用程序作为两个同名文件安装和维护在两个不同的位置,一个用于配置,另一个用于操作。

因此,让我们在/etc/tarantool/instances.enable中配置crud.lua:

box.cfg{} 

if not box.space.crudspace then s = box.schema.space.create('crudspace')   
  s:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}}) 
end 

local m = require('crud').start({...})

如果不存在名为“crudspace”的新空间,该文件将创建一个名为“crudspace”的新空间,并创建一个索引(请注意,所有Tarantool空间必须至少有一个索引)。最后,它通过从其他位置的姊妹文件调用start函数来启动服务器。现在,我们将在/usr/share/tarantool中创建姐妹代码文件,也名为crud.lua:

function create(req)
  local selfVar = req:post_param(data)
  for k,v in pairs(selfVar) do
    box.space.crudspace:auto_increment{v}
  end
end

function read(self)
  return self:render({ json = box.space.crudspace:select() })
end

function start()
  local server = require('http.server').new(nil, 8080, {app_dir='/usr/share/tarantool'})
  server:route({ path = '/', file='index.html'})
  server:route({ path = '/read'}, read)
  server:route({ path = '/create'}, create)
  server:start()
end

return {
  start = start
}

事实上,这是用于“创建”和“读取”的Tarantool代码的全部,不需要额外的DB连接文件!基本上,我们的文件包括三个函数,一个用于创建任务,一个用于读取任务,一个用于运行服务器。在CREATE函数中,我们接受来自前端的POST请求,该请求被转换为LUA表,然后插入到数据库中。我想在这里指出的一件事是,auto_increment 对于Tarantool中的序列,已弃用,但由于它稍微短了一点,我使用它来保持代码的简洁性序列实际上添加了相当多的附加功能,但这里没有时间解释它们)。

接下来,我们有一个Read函数,它基本上对整个空间执行SELECT语句,将其转换为JSON,然后将其发送回请求它的前端上的JavaScript。

最后,启动函数运行我们的服务器(指定默认目录,app_dir),然后处理路由处理。

好的,现在我们将为前端设置HTML/CSS/JS文件。在/usr/share/tarantool中,创建两个目录:‘public’目录和‘templates’目录。‘在模板中,将index.htmland放在公共位置,创建一个css和一个js文件夹。欢迎您在CSS文件夹中放置一些CSS以使应用程序看起来更美观(我使用的CSS文件来自Skeleton框架)。然后在js文件夹中添加main.js文件。

注意,我们的HTML文件需要在“Operations”crud.js的start函数中的路由上指定(如上所述)。否则,它非常简单,有一个标题、一个用于添加待办事项的表单,然后是一个用于在底部附加JavaScript生成的待办事项的<div>:

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="css/main.css">
    <title>Tarantool CRUD</title>
  </head>

  <body>
    <h3>Tarantool Todos</h3>
    <div id="todoform">
      <form id="addatodo">
        <label for="todoname">add a todo</label>
        <input id="todoname" type="text" name="todoname">
        <input type="submit" id="submit" value="submit">
      </form>
    </div>

    <div id="div1"></div>

  <script src="js/main.js"></script>
  </body>
</html>

现在让我们继续讨论JavaScript。每次命中根路由时,我们将使用获取要在后端调用Tarantool,我们将动态构建todo,并通过Tarantool响应中的for-of循环将它们附加到DOM:

fetch('/read')
.then(response => response.json())
.then(data => {
  mainNode = document.getElementById("div1")
  for (const x of data) {
    let todo = document.createElement("p")
    let todo_text = document.createTextNode(x[1])
    todo.appendChild(todo_text)
    mainNode.appendChild(todo)
  }
}).catch((err) => {          
   console.log(err)
})

之后,我们将通过以下表单处理新待办事项的深渊翻滚:

let toDoForm = document.getElementById("todoform")
toDoForm.addEventListener('submit', function(event){
  event.preventDefault()
  let todo = document.getElementById("todoname")
  let data = new URLSearchParams()
  data.append('todovalue', todo.value) 
  fetch('/create', {
    method: "POST",
    body: data
  }).then((response) => {
    location.reload()
  }).catch((err) => {
    console.log(err)
  })
})

这将在每次添加TODO时发送到Tarantool,然后调用路由路由并重新构建DOM,包括新的TODO。每次重新构建DOM并不一定是理想的,但这毕竟是一次Tarantool练习!

最后,我们将从以下内容开始我们的应用程序tarantoolctl start crud.lua 。您可以在端口8080访问您的IP地址以调出它,并且您可以使用以下命令检查其状态tarantoolctl status crud.lua。您可能会惊讶于您的应用程序在tarantoolctl下运行的健壮性。一周后再来检查一下!

好了,这就是我们应用程序的“创建”和“读取”功能。在本系列的下一篇文章中,我们将继续“更新”和“删除”。