搭建Node.js后端

从头开始搭建一个Node.js后端,并实现查询历史数据的功能,下面是详细的步骤说明,包括环境配置、项目初始化、代码编写、以及服务器启动。

1. 环境配置

1.1 安装 Node.js 和 npm

首先,你需要在你的电脑上安装 Node.js 和 npm(Node.js 包管理器)。你可以从 Node.js 官方网站 下载并安装最新的 LTS 版本。

  • 验证安装:安装完成后,可以通过命令行验证安装是否成功。

    node -v
    npm -v 
    

    这两个命令会输出 Node.js 和 npm 的版本号。

2. 初始化 Node.js 项目

2.1 创建项目目录

在命令行中,导航到你希望创建项目的目录,然后创建一个新的项目目录。

mkdir wechat-miniprogram-server cd wechat-miniprogram-server 

2.2 初始化 npm 项目

在项目目录中运行以下命令来初始化一个新的 npm 项目。这会创建一个 package.json 文件,用于管理项目的依赖和配置。

npm init -y 

-y 参数会使用默认配置初始化项目。如果你想手动设置项目名称、版本等信息,可以省略 -y 参数并按提示输入相关信息。

3. 安装 Express 框架

3.1 安装 Express

Express 是一个简洁且灵活的 Node.js Web 应用框架,用于处理 HTTP 请求和构建 RESTful API。使用以下命令安装 Express:

npm install express --save 

--save 参数会将 Express 添加到 package.json 的依赖项中。

4. 编写服务器代码

4.1 创建服务器文件

在项目根目录下创建一个 server.js 文件,这是你的服务器主文件。

type nul > server.js

4.2 编写服务器代码

server.js 中编写以下代码。这段代码创建了一个基本的 Express 服务器,并定义了一个简单的 API 接口用于查询历史数据。

const express = require('express'); const app = express(); // 解析 JSON 请求体 app.use(express.json()); // 模拟数据 const mockData = [ { id: 1, title: '历史记录1', date: '2024-08-20' }, { id: 2, title: '历史记录2', date: '2024-08-19' }, { id: 3, title: '历史记录3', date: '2024-08-18' }, { id: 4, title: '历史记录4', date: '2024-08-17' } ]; // 查询历史数据接口 app.post('/api/search', (req, res) => { const query = req.body.query.toLowerCase(); const result = mockData.filter(item => item.title.toLowerCase().includes(query)); res.json(result); }); // 启动服务器 const PORT = 3000; app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); }); 
5. 启动服务器

5.1 启动服务器

在命令行中,确保你位于项目根目录,然后使用以下命令启动服务器:

node server.js 

如果你看到如下输出,说明服务器启动成功:

Server running on http://localhost:3000 
6. 测试 API 接口

6.1 使用 Postman 或 cURL 测试

你可以使用 Postman 或 cURL 来测试你的 API 接口。

  • Postman 测试

    1. 打开 Postman,选择 POST 请求。

    2. 在 URL 中输入 http://localhost:3000/api/search

    3. Body 选项卡中选择 raw,并将类型设置为 JSON

    4. 输入如下 JSON 数据作为请求体:

      { "query": "历史记录1" } 
      
    5. 点击 Send 按钮,你应该会看到服务器返回的匹配数据。

  • cURL 测试

    你也可以使用 cURL 命令行工具测试:

    curl -X POST http://localhost:3000/api/search -H "Content-Type: application/json" -d '{"query":"历史记录1"}' 
    

    这将返回与查询条件匹配的历史记录。

7. 部署与优化

7.1 部署到生产环境

在开发阶段,服务器运行在 localhost 上。要将其发布到互联网上,你可以使用云服务提供商(如 AWS、阿里云、腾讯云等)来部署你的 Node.js 应用。

  • 配置生产环境

    • 考虑使用环境变量配置端口、数据库连接等信息。
    • 使用 pm2 等工具管理你的 Node.js 进程,确保应用在服务器崩溃后自动重启。
  • 安全性考虑

    • 确保你的 API 安全,包括验证用户输入,防止 SQL 注入和跨站脚本攻击。
    • 使用 HTTPS 确保数据传输的安全性。
8. 项目扩展

8.1 数据库集成

目前的项目使用的是模拟数据。如果你需要集成数据库(如 MySQL、MongoDB 等),可以按照以下步骤扩展:

  1. 安装数据库驱动程序:

    npm install mongoose # MongoDB 驱动 npm install mysql2 # MySQL 驱动 
    
  2. 在服务器中配置数据库连接,并修改 search 接口逻辑,使其从数据库中查询数据。

  3. 使用数据库管理数据的存储、查询、更新等操作。

在 Node.js 项目中,连接数据库的代码通常写在一个独立的模块文件中,便于维护和复用。以下是详细的步骤,包括如何组织代码和在不同文件中管理数据库连接。

1. 创建数据库连接模块

首先,在项目的根目录下创建一个 db.js 文件,用于管理和导出数据库连接。

1.1 创建 db.js 文件

你可以在项目根目录下使用以下命令创建 db.js 文件:

  • 在Windows上(使用命令提示符):

    type nul > db.js 
    
  • 或者直接在文件资源管理器中创建

    • 打开项目根目录,右键点击空白处,选择“新建” -> “文本文档”。
    • 将文件命名为 db.js,然后修改文件扩展名为 .js
1.2 编写数据库连接代码

db.js 文件中,编写并导出数据库连接池。以 MySQL 为例,代码如下:

const mysql = require('mysql'); // 创建数据库连接池 
const pool = mysql.createPool(
{ 
    host: 'localhost', // 数据库主机名或IP地址 
    user: 'root', // 数据库用户名 
    password: 'your_password', // 数据库密码 
    database: 'your_database', // 数据库名称 
    connectionLimit: 10 // 连接池中最大连接数 
}); // 导出数据库连接池 
module.exports = pool; 
2. 在其他模块中使用数据库连接

接下来,你可以在项目的其他文件中导入并使用这个数据库连接。例如,在 server.js 中使用这个连接池来执行查询。

2.1 在 server.js 中导入 db.js

server.js 文件中导入刚刚创建的 db.js 模块,并使用它来查询数据库。

const express = require('express'); 
const pool = require('./db'); // 导入数据库连接 
const app = express(); 
app.use(express.json()); 
// 示例查询接口
app.get('/api/users', (req, res) => {
     pool.query('SELECT * FROM users', (error, results) => { 
     if (error) { 
          return res.status(500).json({ error: error.message });
     } 
    ?res.json(results);  
    }); 
});  
const PORT = 3000; 
app.listen(PORT, () => {
 console.log(`Server running on http://localhost:${PORT}`); 
}); 
3. 使用 db.js 管理数据库连接的好处
  • 模块化代码:将数据库连接封装在一个独立模块中,使得代码更清晰,更易于管理和复用。
  • 配置集中管理:可以轻松更改数据库连接配置(如主机、用户、密码等)而无需修改多个文件。
  • 复用连接池:通过连接池复用数据库连接,提高性能并减少数据库连接的开销。
4. 提高代码的健壮性

为了让代码更加健壮,你可以在 db.js 中添加错误处理和日志记录等功能,确保数据库连接在生产环境中稳定运行。例如:

const mysql = require('mysql'); // 创建数据库连接池 
const pool = mysql.createPool(
{ 
host: 'localhost', 
user: 'root', 
password: 'your_password', 
database: 'your_database', 
connectionLimit: 10 
}
); 
// 检查数据库连接
pool.getConnection((err, connection) => { 
if (err) 
{ 
?  console.error('数据库连接失败:', err); 
} 
else {
 console.log('数据库连接成功'); 
?connection.release(); // 释放连接 
}
});
 module.exports = pool;

默认情况下,MySQL 服务器的端口号是 3306。如果你的 MySQL 服务器运行在不同的端口上,或者你想显式地指定端口号,则需要在连接配置中包含 port 选项。

这里是包括端口号的完整示例代码:

示例代码:连接 MySQL 并查询数据
const mysql = require('mysql2'); // 创建数据库连接 
const connection = mysql.createConnection(
{ 
?    host: 'localhost', // 数据库主机名或IP地址 
?    port: 3306, // 数据库端口号,默认为3306 
?    user: 'root', // 数据库用户名
?    password: 'your_password', // 数据库密码 
?    database: 'your_database' // 数据库名称 
}); 
// 连接到数据库 
connection.connect(err => { 
?    if (err) { 
?        console.error('连接数据库失败:', err.stack); 
?        return; 
?    } 
?    console.log('已连接到数据库'); 
}); 
// 查询数据 
connection.query('SELECT * FROM your_table', (error, results) => {
?      if (error) throw error; 
?      console.log('查询结果:', results); 
}); 
// 关闭连接
connection.end(); 
参数说明
  • host: 数据库服务器的主机名或IP地址。如果 MySQL 服务器在本地运行,通常设置为 localhost
  • port: MySQL 服务器的端口号,默认为 3306。如果你的 MySQL 服务器使用了自定义端口,需要在这里指定。
  • user: 连接到 MySQL 数据库所使用的用户名。
  • password: 对应的用户密码。
  • database: 你想要连接的数据库名称。
注意

如果你在默认端口(3306)上运行 MySQL,并且不需要显式指定端口号,你可以省略 port 选项。

要测试编写的 Node.js 应用是否能够成功连接到 MySQL 数据库并执行查询,按照以下步骤进行操作。

1. 确保 MySQL 服务器正在运行

首先,确保你的 MySQL 服务器正在运行,并且你能够使用提供的凭据(用户名、密码)登录到 MySQL 数据库。

你可以使用 MySQL 客户端工具(如 MySQL Workbench、phpMyAdmin)或者命令行工具来确认这一点。比如,使用命令行工具可以通过以下命令连接到 MySQL:

mysql -u root -p 

系统会提示你输入密码,成功后应该能够进入 MySQL 命令行。

2. 编写测试代码

确保你的 db.js 文件或相关代码已经准备好,如下所示:

const mysql = require('mysql2'); // 创建数据库连接 
const connection = mysql.createConnection({ 
     host: 'localhost', 
     port: 3306, // 如果你的MySQL服务器在不同端口上运行,请更改此值 
     user: 'root',
     password: 'your_password', 
     database: 'your_database'
}); 
// 连接到数据库 
connection.connect(err => { 
?   if (err) { console.error('连接数据库失败:', err.stack); return; }
?   console.log('已连接到数据库');
 }); 
// 查询数据 
connection.query('SELECT * FROM your_table', (error, results) => {
?  if (error) throw error; console.log('查询结果:', results); 
}); 
// 关闭连接 
connection.end(); 

your_passwordyour_databaseyour_table 替换为你实际的数据库密码、数据库名称和数据表名称。

3. 运行测试代码

在命令行中,导航到你的项目目录,然后运行该文件。假设你将代码保存在 db.js 文件中,可以运行以下命令:

node db.js 
4. 观察输出结果

运行之后,你应该看到以下几种情况之一:

  1. 连接成功,且查询成功

    • 控制台会输出 已连接到数据库 的信息。
    • 紧接着会输出查询结果,即 your_table 表中的所有数据。

    示例输出:

    已连接到数据库 查询结果: [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ] 
    
  2. 连接失败

    • 控制台会输出 连接数据库失败,并带有详细的错误信息(如数据库凭据错误、无法连接到服务器等)。

    示例输出:

    连接数据库失败: Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES) 
    

    此时,你需要检查数据库的主机名、端口、用户名、密码等信息是否正确,并确保 MySQL 服务器正在运行。

  3. 查询失败

    • 可能会成功连接数据库,但在查询数据时出现错误,比如表不存在或查询语句有误。

    示例输出:

    已连接到数据库 Error: ER_NO_SUCH_TABLE: Table 'your_database.your_table' doesn't exist 
    

    此时,你需要检查 SQL 查询语句以及数据库中的表名称是否正确。

5. 处理常见错误
  • ER_ACCESS_DENIED_ERROR:表示用户名或密码错误,请确保提供的用户名和密码正确无误。
  • ER_BAD_DB_ERROR:表示数据库不存在,请确保数据库名称正确,并且数据库已经创建。
  • ER_NO_SUCH_TABLE:表示表不存在,请检查表名称,确保它已在数据库中创建。
6. 修改并重新运行

如果遇到错误,修改你的代码或数据库设置,然后再次运行 node db.js 进行测试,直到连接和查询成功为止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux(18)——提高命令行运行效率

目录 一、创建和执行 shell 脚本: 1、命令解释器: 2、执行 Bash Shell 脚本: 3、从 shell 脚本提供输出: 二、对特殊字符加引号: 1、反斜杠 (\): 2、单引号 ( &…

软件系统安全逆向分析-混淆对抗

1. 概述 在一般的软件中,我们逆向分析时候通常都不能直接看到软件的明文源代码,或多或少存在着混淆对抗的操作。下面,我会实践操作一个例子从无从下手到攻破目标。 花指令对抗虚函数表RC4 2. 实战-donntyousee 题目载体为具有漏洞的小型软…

计算机网络 (33)传输控制协议TCP概述

一、定义与基本概念 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它工作在OSI模型的第四层,即传输层,为用户提供可靠的、有序的和无差错的数据传输服务。TCP协议与UDP协议是传输层的两大主要协议,但两者在设计上有明显的不同&…

【从0带做】基于Springboot3+Vue3的高校食堂点餐系统

大家好,我是武哥,最近给大家手撸了一个基于SpringBoot3Vue3的高校食堂点餐系统,可用于毕业设计、课程设计、练手学习,系统全部原创,如有遇到网上抄袭站长的,欢迎联系博主~ 详细介绍 https://www.javaxm.c…

一文说清dockerfile编写

docker用的时间比较久了,关于怎样把jar打成镜像,怎样基于已有mysql镜像添加额外初始化后封装成新的镜像,进行简单的说明。 1.jar封装镜像 from centos # 设置本地为中文,解决中文乱码问题 RUN localedef -i zh_CN -f UTF-8 zh_CN…

基于Python实现的通用小规模搜索引擎

基于Python实现的通用小规模搜索引擎 1.项目简介 1.1背景 《信息内容安全》网络信息内容获取技术课程项目设计 一个至少能支持10个以上网站的爬虫程序,且支持增量式数据采集;并至少采集10000个实际网页;针对采集回来的网页内容, 能够实现网页文本的分…

ssm旅游攻略网站设计+jsp

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 需要源码或者定制看文章最下面或看我的主页 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框架介绍 3 2.2 B/S结构介绍 3 …

算法提高 图形输出

时间限制:C/C 1000MS,其他语言 2000MS 内存限制:C/C 512MB,其他语言 1024MB 难度:困难 分数:100 OI排行榜得分:14(0.1*分数2*难度) 描述 编写一程序,在屏幕上输出如下内容&#xff1…

[程序设计]—代理模式

[程序设计]—代理模式👳 本文章记录学习于——52.面向切面:AOP-场景模拟_哔哩哔哩_bilibili 最近闲来无事,在学习Spring的源码: 后面慢慢更新源码系列blog,希望多多关注🙏🙏 目前已经总结的b…

ue5玩家角色添加武器。切换武器位置,手上武器放到背上。演示一下人体插槽和武器的连接。仅仅演示,实际项目不是这么用的

把第一人称资源包导进来 这就是我们枪的骨骼网格体 我们找到这个骨骼 右手添加插槽 取个名字 因为武器上也有动画,所有武器单独写个蓝图类 新建一个蓝图类 BP_Weapon 把枪的蓝图拖到人的静态网格体下,成为一个部分 选中BP_Weapon的父类套接字…

如何选择适合的证件照制作软件,让您的照片制作更轻松

在当今数字化的时代,制作证件照不再需要专门前往照相馆。选择一款合适的证件照制作软件,您可以在家中轻松完成标准证件照的拍摄与制作。然而,面对市面上琳琅满目的软件,找到最适合您需求的软件并不简单。本文将为您详细介绍选择证…

数据挖掘实训:天气数据分析与机器学习模型构建

随着气候变化对各行各业的影响日益加剧,精准的天气预测已经变得尤为重要。降雨预测在日常生活中尤其关键,例如农业、交通和灾害预警等领域。本文将通过机器学习方法,利用历史天气数据预测明天是否会下雨,具体内容包括数据预处理、…

车载音频开发(二):对音频数据作音量调节

通过前一个章节打下的基础车载音频开发(一):从看懂wav开始https://blog.csdn.net/Hellomino_/article/details/140873133?fromshareblogdetail&sharetypeblogdetail&sharerId140873133&sharereferPC&sharesourceHellomino_&…

Apache XMLBeans 一个强大的 XML 数据处理框架

Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架,它提供了一种方式将 XML Schema (XSD) 映射到 Java 类,从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…

74 mysql having 的实现

前言 这里 我们主要是 看一下 having 的相关实现 having 经常是配合 group by 这边进行使用, 进行一个基于 group by 之后的结果的一个, 条件限定 我们这里 以最简单的 group by having 来进行调试, 他会分为 两个阶段, 一个阶段是 group by 之后的结果输出到临时表, 另外…

PyCharm+RobotFramework框架实现UDS自动化测试——(一)python-can 库的安装与环境配置

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 文章目录 1. 概述2.安装 python-can 库—基于pycharm在对应的工程下3. 在任意盘中安装环境4. 导入 can 模块语法5. 配置 CAN 接口6.CANoe设备连接语法 1. 概述 本专栏主…

Java Spring Boot实现基于URL + IP访问频率限制

点击下载《Java Spring Boot实现基于URL IP访问频率限制(源代码)》 1. 引言 在现代 Web 应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段。为了保护系统资源,防止服务器过载或服务不可用,需要对接口的访问频率进行限制。本文将介绍如…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言: 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream,许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下,龙蜥操作系统(OpenAnolis)作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

现代企业架构白皮书(可以在线阅读完整PDF文件)

数据架构元模型综述 数据架构的内容元模型包括“结构”、“端口”两个部分,如下图所示: 结构部分用来对数据模型、数据处理建模,其中包括数据对象、数据组件 端口部分用来对数据模型的边界建模,其中包括数据服务 数据架构元模型…

【面试题】技术场景 7、定位系统瓶颈

系统瓶颈定位方法总述 面试官询问如何快速定位系统瓶颈,旨在考察线上调试经验。主要方法包括: 压测:在项目上线前找出系统瓶颈并修复。监控工具或链路追踪工具:项目上线后用于实时监控或评测找瓶颈。Arthas(原阿尔萨…