当前位置: 首页 > 后端技术 > Node.js

[NodeHero]5.Node.js数据库教程

时间:2023-04-03 11:55:28 Node.js

risingstack.com/node-js-database-tutorial/下面的Node.js数据库教程将展示如何为Node.js应用程序设置数据库并教您使用它的基础知识。将数据存储在全局变量中正如您在上一章中学到的,为用户提供静态页面,可能适用于登录页面或个人博客。但是如果你想提供个性化的内容,数据就必须存在于某个地方。例如:用户注册。定制内容可以提供给个人用户,或者仅在用户通过身份验证后才可用。如果用户想要注册你的应用程序,你可能需要创建一个路由处理程序以允许他成功注册:constusers=[]app.post('/users',function(req,res){//来自请求消息体获取用户发送的数据constuser=req.bodyusers.push({name:user.name,age:user.age})res.send('注册成功!')})这样,用户可以存储在一个全局变量中,该变量在应用程序的生命周期内驻留在内存中。由于以下几个原因,使用这种方法可能会出现问题:内存很昂贵,每次重新启动应用程序时内存都会重置,如果不清理,有时堆栈会溢出。将数据存储在文件中您接下来想到的可能是将数据存储在文件中。通过将用户数据永久存储在文件系统中,可以避免前面列出的问题。实际上,该方法如下所示:constfs=require('fs')app.post('/users',function(req,res){constuser=req.bodyfs.appendToFile('users.txt',JSON.stringify({name:user.name,age:user.age}),(err)=>{res.send('Registrationsucceeded!')})})这样我们就不会丢失用户数据,不会即使在服务器重启后。这种解决方案也具有成本效益,因为购买存储空间比RAM更便宜。不幸的是,以这种方式存储用户数据仍然有几个缺点:添加用户数据没问题,但要考虑更新或删除。如果保存到文件中,并行访问文件就没那么容易了(系统级锁会阻止写入数据)。缩放应用程序时,无法在服务器之间拆分文件(可以,但该方法超出了本教程的级别)。这是真正的数据库发挥作用的地方。您可能听说过有两种主要类型的数据库:SQL和NOSQL。SQL让我们从SQL开始。SQL是为关系数据库设计的查询语言。根据您使用的产品,SQL有多种风格,但基本原理都是相同的。数据本身将存储在表中,每个插入的块将在表中表示为一行,就像在Google表格或MicrosoftExcel中一样。在SQL数据库中,您定义模式-这些模式为您要放入其中的数据提供了框架。在存储数据之前,必须设置不同值的类型。比如用户数据要定义一张表,告诉数据库usernames是string类型,age是integer类型。NoSQL另一方面,NoSQL数据库在过去十年中变得相当流行。如果你使用NoSQL,你不需要定义一个模式,你可以存储任意的JSON。这对于JavaScript来说很方便,因为在JavaScript中很容易将对象转换为JSON。但是要小心NoSQL,因为它不能保证数据的一致性或知道数据库中存储的内容。Node.js和MongoDB我们一直听到关于Node.js的一个常见误解:“Node.js只能与MongoDB一起使用(MongoDB是最流行的NoSQL数据库)。”根据我的经验,这是不正确的。大多数数据库都有驱动程序,它们在NPM上也有库。在我看来,它们和MongoDB一样简单易用。Node.js和PostgreSQL为简单起见,我们打算在下面的示例中使用SQL。我的选择是PostgreSQL。要启动并运行PostgreSQL,必须在您的计算机上安装它。在Mac上,使用自制软件安装PostgreSQL。另外,如果是Linux,请使用包管理器安装它。有关更多信息,请阅读这篇关于启动和运行第一个数据库的优秀指南。如果您要使用数据库浏览工具,我推荐命令行程序psql-它与PostgreSQL服务器安装程序捆绑在一起。如果您开始使用PostgreSQL,这里有一个小备忘单,它会派上用场。如果您不喜欢命令行界面,可以使用开源的PostgreSQL管理GUI工具pgAdmin。请注意,SQL本身就是一种语言,我们不会解释它的所有功能,只会解释最简单的功能。要了解有关SQL的更多信息,有很多很好的课程可以解释PostgreSQL的基础知识。Node.js数据库交互首先要创建要使用的数据库。为此,请在终端中键入以下命令:createdbnode_hero然后,创建用户表:CREATETABLEusers(nameVARCHAR(20),ageSMALLINT);最后,回到编码。下面是通过Node.js程序与数据进行交互的代码:'usestrict'constpg=require('pg')constconString='postgres://username:password@localhost/node_hero'//确保匹配你自己的数据库凭证pg.connect(conString,function(err,client,done){if(err){returnconsole.error('errorfetchingclientfrompool',err)}client.query('SELECT$1::varcharASmy_first_query',['节点英雄'],function(err,result){done()if(err){returnconsole.error('errorhappenedduringquery',err)}console.log(result.rows[0])process.exit(0)})})这是一个简单的PostgreSQL'helloworld'例子。请注意,第一个参数是SQL命令字符串,第二个参数是提供给查询的参数值数组。如果是根据用户输入插入到数据库中,就会有很大的安全问题。这种方法可防止SQL注入攻击,这是一种攻击者试图利用完全未处理的SQL查询的攻击类型。在创建任何面向用户的应用程序时,必须始终考虑这种情况。要了解有关SQL安全性的更多信息,请查看我们的Node.js应用程序安全备忘单。让我们继续前面的例子。app.post('/users',function(req,res,next){constuser=req.bodypg.connect(conString,function(err,client,done){if(err){//传递错误来表达错误处理程序returnnext(err)}client.query('INSERTINTOusers(name,age)VALUES($1,$2);',[user.name,user.age],function(err,result){done()//这个done回调会通知pg驱动可以关闭连接,或者返回连接缓冲池if(err){//将错误传递给expresserrorhandlerreturnnext(err)}res.send(200)})})})解锁完成:用户存储在数据库中!:)现在我们尝试获取它们。接下来,向应用程序添加一个新端点以获取用户。app.get('/users',function(req,res,next){pg.connect(conString,function(err,client,done){if(err){//将错误传递给错误处理程序returnnext(err)}client.query('SELECTname,ageFROMusers;',[],function(err,result){done()if(err){//将错误传递给表达错误处理程序returnnext(err)}res.json(result.rows)})})})不太难吧?现在,您可以运行提供给Node.js应用程序的任何复杂SQL查询。使用这种技术,您可以在您的应用程序中永久存储数据,并且由于Node-postgreSQL模块团队的辛勤工作,存储数据是小菜一碟。我们已经了解了在Nodejs中使用数据库所必须了解的所有基础知识。现在去自己创造一些东西。尝试,实验,因为这是成为真正的Node战士的最佳方式。练习和准备下一章,如何与第三方API通信!如果您对本教程或在Node.js中使用数据库有任何疑问,请随时提问!

猜你喜欢