Node.js及mysql的安装,建立页面,javascript对mySQL数据库的操作过程

news2025/2/22 19:52:57

 具体动态效果看视频

node.js连接MySQL数据库操作

第一部分;配置服务器环境

 Nods.js, NPM,CNPM,mysql2,express的安装

前往 Node.js 官方网站(https://nodejs.org/)下载并安装最新的稳定版本,确定配置好path环境变量,其他服务器解释语言环境安装也用同样的方法,确保能定位到主程序目录。

敲入cmd命令>查看node版本

[第1步]cmd命令> npm config set registry http://mirrors.cloud.tencent.com/npm/

[解释]:npm config set registry  https://registry.npmjs.org     //官方镜像源

国内有多个 npm 镜像源,常用的包括:

淘宝镜像:

搜索地址:http://npm.taobao.org/

registry 地址:http://registry.npm.taobao.org/

淘宝新镜像源:https://registry.npmmirror.com/

cnpmjs 镜像:

搜索地址:npmmirror 镜像站

registry 地址:http://r.cnpmjs.org/

【可以用】腾讯云镜像源:http://mirrors.cloud.tencent.com/npm/

华为云镜像源:https://mirrors.huaweicloud.com/repository/npm/

阿里云镜像源:https://registry.npm.alibaba-inc.com/

中国科技大学镜像:npm | Home

[第2步]cmd命令>安装npm, npm install -g npm@latest  //选择最新的npm安装,

安装成功提示如下:

[解释]:npm cache clean --force 命令来清除缓存

npm install -g npm@latest :这将把 npm 升级到最新版本。--

dos命令>npm -v查看npm的版本

查看提示如下:

npm安装cnpm

[第3步]cmd命令> npm install -g cnpm

安装成功提示如下:

dos命令>cnpm -v 查看cnpm版本

查看提示如下:

[第4步]cmd命令>cnpm install mysql

安装node的MySQL插件

     cnpm install mysql --save

    cnpm install -g mysql 

安装成功提示如下:

[第5步]cmd命令>安装 MySQL2 驱动:

cmd命令>cnpm install mysql2 

安装成功提示如下:

[第6步]cmd命令>安装express

cmd命令>npm install express

这里显示需要安装 express和mysql2,输入命令npm install express和npm install mysql2

安装成功提示如下:

MySQL的安装与配置

个人喜欢DOS命令手动安装mySQL,用这个绿色版本mysql-8.3.0-winx64,

把x盘:\mysql-8.3.0-winx64\bin目录添加path环境变量中

      安装MySQL服务: mysqld --install mysql

       移除MySQL服务: mysqld --remove mysq

      启动MySQL服务:  net start mysql

初始化  mysqld --initialize --console

登录MySQL      mysql -u root -p

初始登录,设置密码   set password for username @localhost = password('root');

单独安装MySQLserver-8.4.0+ 版本安装,进入MySQL官网MySQL,具体看教程MySql 安装与使用(非常详细)_mysql安装-CSDN博客

或者,安装wamp_服务器(apache_mysql_php服务器)

或者,xampp_服务器(Apache_MySQL_PHP_PERL)

MySQL图形界面管理工具安装 navicat_for_mysql,datagrip-2023,mysql-connector-j-8.3.0

Web SQL(Win_edge的浏览器数据库)也可以了解下。

第二部分:创建网站文件

[第7步]创建server.js的服务文件,代码如下,根据实际情况自己替换 MySQL用户名、MySQL密码、MySQL数据库名,主意文中仍然有四处需要更换的"MySQL数据库表格名"

const express = require('express');
const mysql = require('mysql2');
const path = require('path');
 
const app = express();
 
// 创建数据库连接配置
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'MySQL用户名',
  password: 'MySQL密码',
  database: 'MySQL数据库名'
});
 
// 执行添加自增主键的操作
connection.query('ALTER TABLE MySQL数据库表格名 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST', (err) => {
  if (err) {
    console.error('添加自增主键出错:', err);
    return;
  }
  console.log('自增主键添加成功');
});
 
// 处理跨域
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  next();
});
 
// 解析请求体的中间件
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
 
app.get('/getData', (req, res) => {
  console.log('开始执行数据库查询');
  connection.query('SELECT * FROM MySQL数据库表格名', (err, results) => {
    if (err) {
      console.error('数据库查询出错:', err);
      res.status(500).send('数据库查询错误');
      return;
    }
    console.log('查询成功,结果:', results);
    res.send(results);
  });
});
 
app.post('/writeData', (req, res) => {
  console.log('请求方法:', req.method);
  console.log('请求头:', req.headers);
  console.log('原始请求体数据:', req.rawBody);
  //console.log('接收到的请求体数据:', req.body); 
  const { name, age, education, experience } = req.body;
 
  console.log('接收到的姓名:', name);
  console.log('接收到的年龄:', age);
  console.log('接收到的学历:', education);
  console.log('接收到的工作经验:', experience);
 
  connection.query('INSERT INTO MySQL数据库表格名 (姓名, 年龄, 学历, 工作经验) VALUES (?,?,?,?)', [name, age, education, experience], (err, results) => {
    if (err) {
      console.error('数据写入出错:', err);
      res.status(500).send('数据写入错误');
      return;
    }
    console.log('数据写入成功');
    res.send('数据写入成功');
  });
});
 
app.delete('/deleteData', (req, res) => {
  const id = req.query.id;  // 获取要删除的行的 id
 
  // 在此处执行数据库删除操作
  connection.query('DELETE FROM MySQL数据库表格名 WHERE id =?', [id], (err, results) => {
    if (err) {
      console.error('删除数据出错:', err);
      res.status(500).send('删除数据错误');
      return;
    }
    console.log('数据删除成功');
    res.send('数据删除成功');
  });
});
 
// 处理静态文件请求
app.use(express.static(path.join(__dirname)));
//app.use(express.static(path.join(__dirname, '/data')));
 
app.listen(3000, () => {
  console.log('服务器运行在 3000 端口');
});

[第8步]创建代码插入网页index.html

<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>数据表格</title>
</head>
 
<body>
  <form id="dataForm">
  <table id="dataTable" border="1" align="center">
    <tr>
      <th width=80>姓名</th>
      <th width=80>年龄</th>
      <th width=80>学历</th>
      <th width=120>工作经验</th>
    </tr>
	<tr>
      <th width=80 ><input type="text" id="name" size="10"/></th>
      <th width=80><input type="number" id="age" size="10"/></th>
      <th width=80><input type="text" id="education" size="10" /></th>
      <th width=120><input type="number" id="experience" size="10"/></th>
    </tr>
	<tr>
      <th colspan="4" align= ><button type="submit">提交</button></th>
    </tr>  
  </table>  
</form>
<script>
	const form = document.getElementById('dataForm');
	form.addEventListener('submit', (e) => {
	  e.preventDefault();		
	  const name = document.getElementById('name').value;	  
	  const age = document.getElementById('age').value;	  
	  const education = document.getElementById('education').value;	  
	  const experience = document.getElementById('experience').value;
	  
 console.log('即将发送的请求体数据:', JSON.stringify({ 
    name: name, 
    age: age, 
    education: education, 
    experience: experience 
  }));
	  fetch('http://localhost:3000/writeData', {
		method: 'POST',
		headers: {
		  'Content-Type': 'application/json'
		},
		body: JSON.stringify({ 
		  name: name, 
		  age: age, 
		  education: education, 
		  experience: experience 
		})
	  })
	.then(response => {
		if (response.ok) {
		  alert('数据提交成功!');
		} else {
		  alert('数据提交失败!');
		}
	  })
	.catch(error => {
		console.error('提交数据出错:', error);
	  });
	});
  </script>
<p align="center"><a href="freeback.html">进入查询页面</a></p>
</body>
 
</html>

[第9步]创建代码查询网页 freeback.html

<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    #dataTable td {
      text-align: center;
    }
    #dataTable td u:hover {
      color: red;
    }
  </style>
</head>
 
<body>
<div id="tableContainer">
  <table id="dataTable" border="1" align="center">
    <tr>
      <th width=80>姓名</th>
      <th width=80>年龄</th>
      <th width=80>学历</th>
      <th width=120>工作经验</th>
	   <th width=120>操作</th>
    </tr>
  </table>
</div>
  <script>
    fetch('http://localhost:3000/getData')
   .then(response => response.json())
   .then(data => {
        const table = document.getElementById('dataTable');
        data.forEach(item => {
          const row = table.insertRow();
          const nameCell = row.insertCell(0);
          const ageCell = row.insertCell(1);
          const educationCell = row.insertCell(2);
          const experienceCell = row.insertCell(3);		  
 		  const deleteCell = row.insertCell(4); // 新增"删除"单元格
			
          nameCell.innerHTML = item.姓名;
          ageCell.innerHTML = item.年龄;
          educationCell.innerHTML = item.学历;
          experienceCell.innerHTML = item.工作经验;			
		  deleteCell.innerHTML = '<u>删除</u>'; // 单元格内添加"删除"文本
			
		  // 为"删除"单元格添加点击事件
      	deleteCell.addEventListener('click', function() {
        // 发送请求到后端删除数据库中的对应行
        fetch(`http://localhost:3000/deleteData?id=${item.id}`, {  // 假设您的数据库表中有一个名为 id 的主键,您需要根据实际情况修改
          method: 'DELETE'
        })
		.then(response => {
          if (response.ok) {
            table.deleteRow(row.rowIndex);
          } else {
            console.error('删除失败');
          }
        })
       .catch(error => {
          console.error('删除出错:', error);
        });
		});				
        });
      })
   .catch(error => {
        console.error('获取数据出错:', error);
        alert('获取数据出错,请检查!');
      });
  </script>
<p align="center"><a href="index.html">返回插入页面</a></p>
</body>
 
</html>

[第9步]启动服务端  node server.js

在浏览器中输入localhost:3000便可查看这个index.html的主页

具体动态效果看b站视频JavaScript对MySQL数据库的添加查看删除操作的页面及配置过程_哔哩哔哩_bilibili

第三部分;VUE,H5自动编译(待续)

[第9步] 安装vue的脚手架 到项目

cnpm install -g @vue/cli

[第10步] 开始一个新的vue项目

vue create <project-name>

[第8步]安装h5网站编辑工具 HBuilderX

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络环境搭建,开发板网线直连电脑网口,电脑WIFI上网

开发板网线直连电脑网口&#xff08;电脑自带&#xff0c;一般有PCI&#xff0c;不是USB网卡&#xff09;&#xff0c;电脑WIFI上网 因为电脑是 WiFi 上网&#xff0c;所以需要添加一个网络适配器并设置成 NAT 模式&#xff0c;供虚拟机上网。 设置双网卡&#xff0c;注意双网卡…

SQL 时间盲注 (injection 第十五关)

简介 SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络攻击方式&#xff0c;通过向SQL查询中插入恶意的SQL代码&#xff0c;攻击者可以操控数据库&#xff0c;SQL注入是一种代码注入攻击&#xff0c;其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&#x…

visual studio使用技巧:快速生成Json、XML对应类

visual studio快速生成Json、XML对应类 在项目中经常用到json或者xml作为配置文件&#xff0c;进行序列化和反序列化就需要有对应的类&#xff0c;重新写一遍类就比较麻烦&#xff0c;这里就讲一下通过visual studio快速生成json或者xml对应类型的方法。 自动生成Json类 复制…

大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【Python】AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

【Python】成功解决AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘ 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博…

MySQL集群+Keepalived实现高可用部署

Mysql高可用集群-双主双活-myqlkeeplived 一、特殊情况 常见案例&#xff1a;当生产环境中&#xff0c;当应用服务使用了mysql-1连接信息&#xff0c;在升级打包过程中或者有高频的数据持续写入【对数据一致性要求比较高的场景】&#xff0c;这种情况下&#xff0c;数据库连接…

STM32之继电器与震动传感器的使用,实现震动灯

在STM32的外设应用中&#xff0c;继电器扮演着重要的角色。继电器作为一种电控制器件&#xff0c;其主要作用是通过小电流控制大电流的通断&#xff0c;实现电路的自动控制和保护。具体来说&#xff0c;继电器在STM32外设中的作用可以归纳为以下几点&#xff1a; 电路隔离与保…

在线学习考试设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

“CSS”第一步——WEB开发系列13

CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;是一种用来为结构化文档&#xff08;如 HTML 文档或 XML 应用&#xff09;添加样式&#xff08;字体、间距和颜色等&#xff09;的计算机语言&#xff0c;CSS 文件扩展名为 .css。 一、什么是 CSS&a…

ubuntu x86_64系统上安装运行aarch系统的虚拟机

安装qemu-system-aarch64 创建sda.qcow2 虚拟磁盘 运行命令启动虚拟机 sudo qemu-system-aarch64 -M virt-4.0 -m 4G -cpu cortex-a57 -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -cdrom ~/下载/openEuler-24.03-LTS-aarch64-dvd.iso -drive ifnone,filesda.qcow2,idhd0…

王老师 linux c++ 通信架构 笔记(五)编译后生成的 nginx 可执行程序的启动

&#xff08;22&#xff09; 启动 nginx &#xff1a; 上网测试一下&#xff1a; 端口号 介绍&#xff1a; &#xff08;23&#xff09; 因为 nginx 监听知名端口号 80 &#xff0c;http 服务。也可以知名端口号&#xff0c;格式如下&#xff1a; 生产环境下可以设置 ngi…

Pulsar官方文档学习笔记——架构概览

架构概览 在最高配置下&#xff0c;pulsar服务应该由一个或多个pulsar集群组成。 一个pulsar集群可以包括如下组件 一个或多个broker。broker会将生产者 的消息分派给消费者。与pulsar配置存储通信来协调各种任务。将消息 存储在 BookKeeper实例中 &#xff08;也可以叫book…

计算机毕业设计选什么题目好?springboot 基于Java的学院教学工作量统计系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

java生成随机数字,生成随机ID

java在代码中生成随机数字和ID的两个方法 import java.util.UUID; import java.util.Random; public class randomID {public static void main(String[] args) {// TODO Auto-generated method stubUUID uuid UUID.randomUUID();String randomId uuid.toString();System.ou…

Qt自定义控件之提升法

1、参考&#xff1a;Qt之实现自定义控件的两种方式——提升法 2、概述&#xff1a;自定义控件是常需要使用到的技能&#xff0c;在既有的Qt控件不能满足开发的前提下&#xff0c;自定义控件给了程序员很多的发挥空间和便利。自定义控件有两种方式&#xff0c;一种是通过提升法来…

记录win10下 yolov8 tensorrt模型部署

前言 我的环境是 CUDA11.6 cudnn8.4 python3.8 vs2022 tensorRT8.4.2.4 实现 参考了下面这个视频和文章&#xff08;跟着视频做为主&#xff0c;文章为辅&#xff09;一遍成功&#xff0c;因为这个博主写的很详细&#xff0c;很赞&#xff0c;我就不再重复去写了。 视频&…

C++ Primer 总结索引 | 第十八章:用于大型程序的工具

1、大规模应用程序的特殊要求包括&#xff1a; 在独立开发的子系统之间 协同处理错误的能力使用各种库&#xff08;可能包含独立开发的库&#xff09;进行 协同开发的能力对比较复杂的应用 概念建模的能力 对应 异常处理、命名空间和多重继承 1、异常处理 1、异常处理机制 …

【算法】令牌桶算法

一、引言 令牌桶算法&#xff08;Token Bucket Algorithm, TBA&#xff09;是一种流行于网络通信领域的流量控制和速率限制算法。它允许一定程度的突发传输&#xff0c;同时限制长时间内的传输速率。令牌桶算法广泛应用于网络流量管理、API请求限流等场景。其基本原理是通过一个…

vue3 响应式 API:computed()

介绍 基本概念&#xff1a; computed()接收一个 getter 函数或者一个包含 getter 和 setter 函数的对象作为参数&#xff0c;并返回一个基于原始响应式数据计算得到的新的响应式数据对象。计算属性的值会根据其依赖的响应式数据自动更新&#xff0c;当依赖的数据发生变化时&am…

设计模式23-职责链

设计模式23-职责链 动机定义与结构定义结构职责链模式图中元素解释工作流程 C 代码推导优缺点应用场景总结 动机 在软件构建过程中&#xff0c;一个请求可能被多个对象处理。但是每个请求在运行时只能有一个接受者。如果显示指定将必不可少的带来请求发送者与接受者的紧耦合。…