发布于 2026-01-06 0 阅读
0

💾 使用 await/async 和 expressjs/polkajs 运行 SQLite

💾 使用 await/async 和 expressjs/polkajs 运行 SQLite

❗❗❗❗这篇博文的灵感来源于我们在Twitch 直播中的工作。如果你想了解我们是如何用 Svelte3 制作博客的,或者你对 Web 开发有任何疑问?欢迎提出任何问题,没有愚蠢的问题!我会尽我所能解答!点击这里👉 👈 即可访问我们的 Twitch 页面。

介绍

SQLite 被许多大型公司使用,例如 Google、Mozilla 和 Facebook。Android 和 iOS 应用程序都将其用作本地数据库。它也被用于嵌入式设备,例如宝马的 iDrive 系统。甚至在 Flame 等恶意软件中也发现了它的踪迹。由此可见,SQLite 的应用场景和产品非常广泛!

要求

  • 已安装最新版本的NodeJS和NPM,或者至少安装了支持Async/Await的版本。
  • SQL基础知识。就是基础!我们这里不会讲什么花哨的东西。
  • 对 Async/await 有基本的了解。我建议阅读我写的关于Async/await 的文章。
  • 所有命令都是 Unix 命令,如果您想在 Windows 上运行它们,需要将其更改为 Windows 版本。我强烈推荐使用WSL

准备工作

我们首先需要初始化一个新的 NPM 项目。让我们创建一个新的 Git 仓库并初始化 NPM。

mkdir sqlite-expressjs-async-await-blogpost
cd sqlite-expressjs-async-await-blogpost
git init
npm init -y

这将创建一个名为 `.` 的文件夹SQLite-expressjs-async-await-blogpost。然后我们将目录切换到刚刚创建的目录,初始化 Git 并package.json使用命令创建一个新的npm init`.`。` -y--yes` 表示接受所有选项。

现在我们的项目已经初始化完毕,让我们来安装所需的 NPM 包。

npm i --save polka sqlite-async

polka是一个极其精简、高性能的 Express.js 替代方案。如果您熟悉 Express.js,那么您会很快上手。我们sqlite-async在这里使用的是 NPM 包而sqlite不是其他包,sqlite3因为正如您从名称中看到的,该包开箱即用地支持 async/await,无需任何特殊配置即可运行。

奔跑波尔卡

我们需要为我们的应用程序创建一个入口点。

touch server.js

这将在该文件夹中创建一个 server.js 文件,现在我们终于可以使用代码编辑器了。
让我们先来尝试启动 polka!

// server.js
const polka = require('polka');

polka()
    .get('/', (req, res) => {
        res.end('<h1>hello world</h1>');
    })
    .listen(3000, err => {
        if (err) throw err;
        console.log(`> Running on localhost:3000`);
    });

首先我们需要引入 `<require>` polka,然后创建一个名为 `<route>` 的路由/。这是根路由,浏览器通常不会在地址栏中显示它,例如,当你访问 `http://localhost:8000` 时,localhost:3000正确的地址是:`http://localhost:8000` http://localhost:3000/,但谁愿意输入这么长的地址呢?我们描述的所有操作都由 ` get()<function>` 函数完成。该listen()函数告诉 polka 监听 `3000` 端口3000,第二个参数是服务器启动时运行的回调函数。你可以把 3000 改成任何你想要的端口号!你甚至可以像个黑客一样,在 `http://localhost:8000` 上运行它1337。现在你可以给自己打电话了Elite;)

但是如何启动服务器呢?很简单!
在项目文件夹内的终端中,您可以输入:

node server.js

这条命令会启动波尔卡舞,你可以去看看localhost:3000,你应该会看到一个大大的胖墩hello world

创建一个空数据库

既然我们知道可以运行服务器,就可以设置 SQLite 了。

请注意,我们的服务器没有使用任何自动重启功能。每次保存后,您都需要手动关闭服务器并重新运行。您可以通过CTRL+C在服务器运行的终端中按下命令,然后使用命令重新运行服务器来完成此操作node server.js

// server.js
const Database = require('sqlite-async')

我们首先需要导入 sqlite-async,现在我们需要server.js稍微修改一下我们的代码,使其能够与 async/await 一起使用。

// server.js
const main = async () => {
    try {
        db = await Database.open(":memory:");
    } catch (error) {
        throw Error('can not access sqlite database');
    }
    polka()
        .get('/', (req, res) => {
            res.end('<h1>hello world</h1>');
        })
        .listen(3000, err => {
            if (err) throw err;
            console.log(`> Running on localhost:3000`);
        });
}

main();

我们一步一步来。

polka()我们完全没有修改代码。
我们只是把所有代码都封装在一个带有 async 语句的箭头函数里,然后在文件末尾调用了这个函数。这样做是为了让 await 生效。

我们来谈谈这行代码:

db = await Database.open(":memory:");

这行代码是最大的新变化!我们正在“打开”一个新的数据库。这个函数实际上会检查是否已经存在数据库,如果存在,则直接连接到该数据库;如果不存在,则创建一个新的数据库,然后再连接到它。:memory:这意味着我们将数据库创建在计算机的内存中,而不是像通常那样创建在文件系统中(如果您希望数据在服务器崩溃或重启后仍然有效,就应该这样做)!我们在:memory:这里使用内存是因为它更容易清理,因为您根本不需要清理任何内存。
所以,当操作成功时,我们就建立了与数据库的连接!之所以使用 `--no-error`,
是因为如果出现未处理的错误,Node.js 会崩溃!在使用 Promise 时,try/catch请务必使用 `--no-error` !try/catch

创建空表!

现在我们有了数据库,还需要创建一个表。我们将创建一个名为 user 的表,其中包含以下列:

  • 名字类型:文本
  • 姓氏类型:文本
// server.js
// insert that code after the `database.open` try/catch
    try {
        await db.run(`
        CREATE TABLE user (
                    firstName TEXT,
                    lastName TEXT
        )
        `);    
    } catch (error) {
        throw Error('Could not create table')
    }

该代码将创建一个名为“table”的表user,该表将有 2 列firstNamelastName类型为 TEXT。

插入一些数据

现在让我们向表格中插入一些数据!

// server.js
// Insert this after the Create table try/catch
    try {
        const insertString = `
            INSERT INTO blogPosts 
            (firstName, lastName)
            VALUES (?,?)
        `;
        await db.run(insertString,
            "Michael",
            "Lazarski"
        );
    } catch (error) {
        throw Error('Could not insert new user');
    }

好的,这个查询包含两部分:一部分是const insertString查询语句,另一部分是实际运行的命令,其中包含我们要插入的数据。

INSERT INTO users(firstName, lastName)

这告诉 SQLite 我们想要将数据插入数据库,第一个字段是 firstName,第二个字段是 lastName。

 VALUES (?, ?)

这行代码很关键。VALUES这里的意思是我们需要指定要插入到表中的值。你可以把它想象成传递给函数的参数列表。这行代码也与上一行users(firtName, lastName)代码有关。顺序在这里很重要!在这个例子中,第一个问号代表名字,第二个问号代表姓氏。但是为什么呢??再看一下这个db.run()函数。第一个参数是我们的查询语句。第二个和第三个参数的顺序与问号的顺序相同。这里有两个跳转。在插入语句中,我们告诉 SQLite 要插入什么;在下一行中,VALUES我们告诉 SQLite 要插入db.run()函数的第二个和第三个参数。这样做是个好习惯,因为sqlite-asyncnpm 包还会帮你准备字符串并转义那些你无法直接插入的字符,比如逗号'或其他特殊字符。

获取数据并将其显示在我们的页面上

现在我们需要查询数据并将其发送回客户端。
以下代码可以实现此功能:

// server.js
// change the .get('/') function
polka()
    .get('/', async (req, res) => {
        const {firstName, lastName} = 
            await db.get("SELECT firstName, lastName FROM user");
        res.end(`<h1>hello ${firstName} ${lastName} </h1>`);
    })

首先,我们将第二个参数(即箭头函数)设为异步函数,以便可以使用 await。由于我们的表中只有一行数据,所以这里可以使用简单的 Select 语句。我们再次从用户表中选择 firstName 和 lastName 字段,并且由于函数返回的只是一个对象db.get(),因此我们可以对其进行析构。最后一步是使用模板字面量创建我们的 HTML 示例。

可选:搜索特定用户

假设你现在有很多用户,你想Michael在数据库中找到第一个用户。为此,你需要SELECT稍微修改一下。

await db.get(`SELECT firstName, lastName 
                FROM user 
                WHERE firstName LIKE ?`,
                "%Michael%");

这里唯一的新东西是 `%`WHERE和 `%` LIKE。我们在这里要做的是查找第一个包含我们指定名字的条目Michael。`%` 表示Michael名字中任何位置都可以包含指定内容。MMichael例如Michaels,`%` 和 `%` 也匹配。

Finale 代码

如果你想查看最终代码,可以在以下GitHub 仓库中找到它。

如果你能帮我做以下几件事,那就太好了!
Twitch关注我!如果能有几个人这样做,对我来说意义非凡!❤❤❤😊

👋你好! Instagram | Twitter | LinkedIn | Medium | Twitch | YouTube

文章来源:https://dev.to/lampewebdev/getting-sqlite-running-with-await-async-and-expressjs-polkajs-2b0g