本文转载自:众成翻译
译者:网络埋伏纪事
连接:http://www.zcfy.cc/article/1751
原文:https://blog.risingstack.com/node-js-database-tutorial/node
以下的 Node.js 数据库教程将展现如何设置 Node.js 应用程序的数据库,而且教你使用它的基础知识。sql
正如在上章所学,为用户提供静态页面,可能适合着陆页或者我的博客。可是,若是想交付个性化的内容,就必须将数据存在某个地方。数据库
举个例子:用户注册。能够为个别用户提供定制内容,或者只让它在用户经过身份验证后可用。express
若是用户想注册你的应用程序,你可能想建立一个路由处理器来让他注册成功:npm
const users = [] app.post('/users', function (req, res) { // 从请求消息体中获取用户发送的数据 const user = req.body users.push({ name: user.name, age: user.age }) res.send('注册成功!') })
经过这种方式,能够把用户存储在一个全局变量中,这个全局变量在应用程序生命周期都会驻留在内存中。json
使用这种方式会由于几个缘由而带来问题:数组
内存很贵,安全
每次从新启动应用程序时,内存都会重置,服务器
若是不清理的话,有时候会遇到栈溢出。网络
出如今你脑海中的下一件事情多是将数据存储在文件中。
若是把用户数据永久性地存储在文件系统中,就能够避免以前列出的问题。
实践中,这个方法看起来就像以下这样:
const fs = require('fs') app.post('/users', function (req, res) { const user = req.body fs.appendToFile('users.txt', JSON.stringify({ name: user.name, age: user.age }), (err) => { res.send('注册成功!') }) })
这种方式咱们不会丢失用户数据,即便服务器重启后也不会。这种解决方案也是经济有效的,由于买存储空间比买内存更便宜。
不幸的是,用这种方式存储用户数据依然有几个缺陷:
添加用户数据是能够的,可是想一想更新或者删除。
若是是存到文件,并行访问文件就没那么容易了(系统级锁会阻止写数据)。
当扩展应用程序时,无法把文件分割放在服务器之间(能够,可是方法超出了本教程的等级)。
这就是真实数据库起做用的地方。
你可能已经据说过数据库有两种主要类型:SQL 和 NOSQL。
咱们以 SQL 开始。SQL 是一种设计用于关系型数据库的查询语言。根据正在使用的产品,SQL 有几种风格,但基本原理都是相同。
数据自己会被存储在表中,每一个插入的块将会被表示为表中的一行,就像 Google Sheets 或者 Microsoft Excel 中的同样。
在一个 SQL 数据库中,你能够定义 schema - 这些 schema 会为你要放进去的数据提供一个骨架。在存储数据以前,必须设置不一样值的类型。例如,必须为用户数据定义一个表,必须告诉数据库用户名是字符串类型,年龄是整型。
另外一方面,NoSQL 数据库在最近十年变得至关流行。若是使用 NoSQL,就不须要定义 schema,能够存储任意 JSON。这对 JavaScript 很方便,由于在 JavaScript 中将对象转换为 JSON 很容易。不过,使用 NoSQL 要小心,由于它没法保证数据的一致性,也没法知道数据库中存的是什么。
咱们总会听到对 Node.js 的一个常见误解:
"Node.js 只能用 MongoDB( MongoDB 是最流行的 NoSQL 数据库)。"
根据个人经验,这是不正确的。大多数数据库都有驱动程序能够用,它们在 NPM 上也有库。据我看,它们与 MongoDB 同样简单易用。
为简单起见,咱们打算在下面的示例中使用 SQL。我选择的是 PostgreSQL。
要让 PostgreSQL 启动和运行,必须将它安装到你的电脑上。若是是 Mac,就用 homebrew 安装 PostgreSQL。另外,若是是 Linux,就用你用的包管理器安装它。
进一步的信息请阅读这篇优秀的指南,让你的第一个数据库启动和运行起来。
若是你打算用一种数据库浏览工具,我推荐使用命令行程序 psql
- 它与 PostgreSQL 服务器安装程序绑在一块儿。这里有一个小速查表,若是你开始用 PostgreSQL,这玩意早晚会派上用场。
若是不喜欢命令行界面,能够用开源的 PostgreSQL 管理图形界面工具 pgAdmin。
注意,SQL 自己就是一门语言,咱们不会讲解它全部功能,只会说起最简单的。要了解更多的关于 SQL 的知识,这里有很多讲解 PostgreSQL 基础知识的课程都还不错。
首先,得建立要使用的数据库。为此,在终端中键入以下命令:
createdb node_hero
而后,建立用户表:
CREATE TABLE users( name VARCHAR(20), age SMALLINT );
最后,回到编码。以下是经过 Node.js 程序与数据交互的代码:
'use strict' const pg = require('pg') const conString = 'postgres://username:password@localhost/node_hero' // 确保要匹配你本身数据库的凭据 pg.connect(conString, function (err, client, done) { if (err) { return console.error('error fetching client from pool', err) } client.query('SELECT $1::varchar AS my_first_query', ['node hero'], function (err, result) { done() if (err) { return console.error('error happened during query', err) } console.log(result.rows[0]) process.exit(0) }) })
这是一个简单的 PostgreSQL 'hello world' 示例。注意第一个参数是 SQL 命令字符串,第二个参数是给查询提供的参数值数组。
若是就按用户输入插入到数据库,会有很大的安全问题。这种方式能够防止 SQL 注入式攻击,这种类型的攻击是攻击者试图利用彻底未处理的 SQL 查询。在建立任何面向用户的应用程序时,必须总要考虑这种状况。要学习更多关于 SQL 安全性的知识,请查看咱们的 Node.js 应用程序安全备忘录。
下面继续前一示例。
app.post('/users', function (req, res, next) { const user = req.body pg.connect(conString, function (err, client, done) { if (err) { // 将错误传递给 express 错误处理器 return next(err) } client.query('INSERT INTO users (name, age) VALUES ($1, $2);', [user.name, user.age], function (err, result) { done() //这个 done 回调会通知 pg 驱动程序链接能够被关闭,或者返回给链接缓冲池 if (err) { // 将错误传递给 express 错误处理器 return next(err) } res.send(200) }) }) })
完成解锁:用户存储在数据库中!:) 如今咱们试着获取他们。下一步,为用户获取给应用程序添加一个新的端点。
app.get('/users', function (req, res, next) { pg.connect(conString, function (err, client, done) { if (err) { // 将错误传递给 express 错误处理器 return next(err) } client.query('SELECT name, age FROM users;', [], function (err, result) { done() if (err) { // 将错误传递给 express 错误处理器 return next(err) } res.json(result.rows) }) }) })
如今你能够运行提供给 Node.js 应用程序的任何复杂 SQL 查询。
使用这种技术,你能够将数据永久存储在应用程序中,多亏了 Node-postgreSQL 模块团队的辛勤劳动,使存储数据变得易如反掌。
咱们已经完成了在 Nodejs 中使用数据库所必须知道的全部基础知识。如今本身去建立一些东西好了。
尝试、实验,由于这是称为一个真正的 Node 勇士的最佳方式。实践并准备下一章若是与第三方 API 通信!
若是你有任何有本教程相关的或者与在 Node.js 中使用数据库的问题,只管提出来!