当前位置: 首页 > news >正文

搭建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 进行测试,直到连接和查询成功为止。

相关文章:

搭建Node.js后端

从头开始搭建一个Node.js后端,并实现查询历史数据的功能,下面是详细的步骤说明,包括环境配置、项目初始化、代码编写、以及服务器启动。 1. 环境配置 1.1 安装 Node.js 和 npm 首先,你需要在你的电脑上安装 Node.js 和 npm&…...

集合——数据结构

数据结构 就是计算机存储数据的方式。 不同情况下采取不同数据结构会让数据查找,存储更加有效率。 栈...

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

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

《机器学习》——支持向量机(SVM)

文章目录 什么是支持向量机?基本原理数学模型 支持向量机模型模型参数属性信息 支持向量机实例(1)实例步骤读取数据可视化原始数据使用支持向量机训练可视化支持向量机结果完整代码 支持向量机实例(2)实例步骤导入数据…...

【PPTist】公式编辑、插入音视频、添加动画

一、插入公式 点击公式的时候 latexEditorVisible 会变成 true src/views/Editor/CanvasTool/index.vue <Modalv-model:visible"latexEditorVisible" :width"880" ><LaTeXEditor close"latexEditorVisible false"update"data &…...

LeetCode - #186 翻转字符串里的单词 II(会员题)

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

Kafka核心参数与使用02

一、从基础的客户端说起 Kafka 提供了非常简单的生产者&#xff08;Producer&#xff09;和消费者&#xff08;Consumer&#xff09;API。通过引入相应依赖后&#xff0c;可以快速上手编写生产者和消费者的示例。 1. 消息发送者主流程 一个最基础的 Producer 发送消息的步骤…...

Three.js 渲染技术:打造逼真3D体验的幕后功臣

文章目录 前言一、着色器&#xff08;Shaders&#xff09;二、后处理&#xff08;Post-processing&#xff09;三、抗锯齿&#xff08;Anti-aliasing&#xff09;四、实时渲染与离线渲染五、光照模型与材质优化六、环境映射&#xff08;Environment Mapping&#xff09;七、纹理…...

QTcpSocket 如何统计在线时长

基本原理 QTcpSocket是 Qt 库中用于 TCP 通信的类。要统计在线时长,关键思路是记录连接建立的时间和当前时间,通过计算两者的差值来得到在线时长。实现步骤 记录连接建立时间: 在连接成功的信号槽函数中记录开始时间。例如,当QTcpSocket成功连接到服务器时,会发出connecte…...

【Altium】AD使用智能粘贴功能把多个网络标签改成端口

1、 文档目标 使用智能粘贴功能把多个网络标签&#xff08;net lable&#xff09;改成端口&#xff08;port&#xff09; 2、 问题场景 客户有一份原理图&#xff0c;网络用的是net label&#xff0c;没用Port&#xff0c;然后创建一个sheet symbol&#xff0c;但是sheet sy…...

.NET 终止或结束进程

如何使用 C# 终止进程。 使用简单的方法终止.NET中的现有进程Process.Kill()。有一个可选参数 true 或 false&#xff0c;用于结束与要结束的进程相关的所有子进程。 了解如何创建流程。 结束当前进程&#xff1a; System.Diagnostics.Process.GetCurrentProcess().Kill(tru…...

R.swift库的详细用法

R.swift 是一个 Swift 工具库,它提供了一个自动生成的类 R,使得你可以通过类型安全的方式访问项目中的资源,例如图片、字体、颜色、XIB 文件等。通过 R.swift,你可以避免字符串类型的错误,提升代码的可维护性。 以下是 R.swift 库的详细用法: 1. 安装 R.swift 使用 Sw…...

Js的回调函数

一、什么是回调函数&#xff08;Callback&#xff09;&#xff1f; 回调函数&#xff08;Callback Function&#xff09;是指一个函数被作为参数传递给另一个函数&#xff0c;并在特定事件发生或操作完成时执行。 可以通俗地理解为一种“委托”机制。 在JavaScript中&#xff0…...

flutter 独立开发之笔记

1、# use: - [flutter_launcher_icons:] 每次修改完icon后&#xff0c;都需要执行一遍 dart run flutter_launcher_icons 2、开启混淆并打包apk flutter build apk --obfuscate --split-debug-info./out/android/app.android-arm64.symbols 3、开启windows支持 flutter con…...

PHP的扩展Imagick的安装

windows下的安装 下载&#xff1a;Imagick扩展 PECL :: Package :: imagick 3.7.0 for Windows​​​​​​​ 下载&#xff1a;ghostscript&#xff08;PDF提取图片时用到&#xff0c;不处理PDF可以不安装&#xff09; Ghostscript : Downloads 安装扩展 Imagick解压后&…...

【git】在服务器使用docker设置了一个gogs服务器,访问和现实都不理想

以下问题应该都可以通过设置custom/conf/app.ini来解决 配置文档参考地址:https://www.bookstack.cn/read/gogs_zh/advanced-configuration_cheat_sheet.md domain显示的事localhost&#xff0c;实际上应该是一个IP地址。 关键字&#xff1a; DOMAIN ROOT_URL 因为是docker…...

多台PC共用同一套鼠标键盘

当环境中有多个桌面 pc 需要操作的时候&#xff0c;在 多台 pc 之间切换会造成很多的不方便 可以通过远程进行连接&#xff0c;但是有一个更好的方案是让多台机器之间共用同一套键盘鼠标 常用的解决方案 synergy 和 sharemouse&#xff0c;通过移动光标在不同的 pc 间切换 s…...

大语言模型是如何训练出来的?

近期听了不少与AI相关的播客&#xff0c;有理想转型AI的分享&#xff0c;有Character.ai出来同事的分享等&#xff0c;结合对Transformer架构的理解尝试大致还原大语言模型的训练过程。不过&#xff0c;当我这样的“中国大妈”也能够大致琢磨明白大语言模型是如何训练出来的时候…...

Vue2与Vue3在项目开发中的选择:深入探讨

文章目录 前言一、Vue2的优势与挑战二、Vue3的进步与特性三、如何做出选择&#xff1f;结语 前言 Vue.js 是一个用于构建用户界面的渐进式JavaScript框架。Vue2和Vue3是其两个主要版本&#xff0c;它们各自拥有一系列特点和优势。随着Vue3的发布&#xff0c;开发者们面临着在新…...

Web枚举:深入了解目标应用系统

Web枚举是渗透测试中重要的第一步&#xff0c;旨在全面收集目标系统的信息&#xff0c;以便后续攻击载荷的构建更具针对性和效率。本文将详细讨论如何通过各种方法识别目标Web应用的技术栈&#xff0c;并提取关键信息。 1. 识别目标系统的技术栈 技术栈指Web应用所依赖的技术组…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...