node.js学习笔记Day2

本文详述了使用Node.js的Express框架与MySQL数据库交互的步骤,包括安装mysql模块、创建数据库配置文件、实现异步查询、处理热启动及接收参数。在实践中,通过调整代码结构,解决了异步方法的问题,并演示了如何通过URL参数执行带参查询。此外,还介绍了启用热启动的方法,以提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

第一部分:用npm安装mysql模块

第二部分:在项目内创建

第三部分:引用opreateDB方法

第四部分:解决异步方法的问题

 第五部分:关于热启动

第六部分:关于接收参数和带参查询数据

今天的学习笔记是在我的上一篇博客学习笔记的基础上进行的

学习的是nodejs之express框架。

有值得注意的地方,就是node安装在哪,你的项目也需要在node安装的文件夹内才能执行到node命令,不然就会报错node不是执行命令。

第一部分:用npm安装mysql模块

在集成终端中输入

卸载mysql模块命令:npm install mysql

卸载mysql模块命令:npm uninstall mysql

查看mysql现安装的版本信息命令:npm view mysql version

查看mysql所有版本信息命令:npm view mysql versions

下载指定mysql模块版本指令:npm install mysql@(版本号)

PS F:\T2009小刘(可以参观,请别破坏!!!)\nodeJS课程\node\myseifAPI> npm install mysql

added 9 packages, and audited 109 packages in 10s

5 vulnerabilities (1 low, 4 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
PS F:\T2009小刘(可以参观,请别破坏!!!)\nodeJS课程\node\myseifAPI> npm view mysql version
2.18.1
PS F:\T2009小刘(可以参观,请别破坏!!!)\nodeJS课程\node\myseifAPI> npm view mysql versions
[
  '0.1.0',        '0.2.0',        '0.3.0',        '0.4.0',
  '0.5.0',        '0.6.0',        '0.7.0',        '0.8.0',
  '0.9.0',        '0.9.1',        '0.9.2',        '0.9.3',
  '0.9.4',        '0.9.5',        '0.9.6',        '2.0.0-alpha',
  '2.0.0-alpha2', '2.0.0-alpha3', '2.0.0-alpha4', '2.0.0-alpha5',
  '2.0.0-alpha6', '2.0.0-alpha7', '2.0.0-alpha8', '2.0.0-alpha9',
  '2.0.0-rc1',    '2.0.0-rc2',    '2.0.0',        '2.0.1',
  '2.1.0',        '2.1.1',        '2.2.0',        '2.3.0',
  '2.3.1',        '2.3.2',        '2.4.0',        '2.4.1',
  '2.4.2',        '2.4.3',        '2.5.0',        '2.5.1',
  '2.5.2',        '2.5.3',        '2.5.4',        '2.5.5',
  '2.6.0',        '2.6.1',        '2.6.2',        '2.7.0',
  '2.8.0',        '2.9.0',        '2.10.0',       '2.10.1',
  '2.10.2',       '2.11.0',       '2.11.1',       '2.12.0',
  '2.13.0',       '2.14.0',       '2.14.1',       '2.15.0',
  '2.16.0',       '2.17.0',       '2.17.1',       '2.18.0',
  '2.18.1'
]
PS F:\T2009小刘(可以参观,请别破坏!!!)\nodeJS课程\node\myseifAPI> 

然后可以在package-lock.json中的"packages"确认是否有mysql模块的依赖在里面,他会出现"mysql": "^2.18.1"的版本号。

  "packages": {
    "": {
      "name": "myseifapi",
      "version": "0.0.0",
      "dependencies": {
        "cookie-parser": "~1.4.4",
        "debug": "~2.6.9",
        "express": "~4.16.1",
        "http-errors": "~1.6.3",
        "jade": "~1.11.0",
        "morgan": "~1.9.1",
        "mysql": "^2.18.1"
      }
    },

第二部分:在项目内创建

一个util文件夹,里面创建一个dbconfig.js配置连接mysql数据库的工具类。

dbconfig.js文件

//导入mysql模块
const mysql = require("mysql");
//配置连接mysql的数据源
const config = {
    host: "localhost",//地址
    port: "3306",//ip
    user: "root",//mysql用户名
    password: "root123",//mysql密码
    database: "liudb"//访问的数据库
}
//一个小技巧,可以直接到module里面编写默认暴露方法
module.exports = {
    /**
     * 
     * @param {sql语句} sql 
     * @param {sql语句中代表?占位符的参数} sqlArr 
     * 解释:因为这个方法是异步方法,所以存在一些专属于异步的问题需要注意。
     */
    opreateDB: function (sql, sqlArr) {
        return new Promise((resolve, reject) => {
            let pool = mysql.createPool(config);
            //getConnection是打开mysql数据库连接的作用,数据库连接池
            pool.getConnection((err, conn) => {
                //如果出现错误err就会有值
                if (err) {
                    //err不为空就交给reject进行处理
                    reject(err);
                }
                //执行sql语句方法,此方法为异步方法。
                conn.query(sql, sqlArr, (err, data) => {
                    //同上,有错不为空
                    if (err) {
                        //同上,不为空交给reject处理。
                        reject(err);
                    } else {
                        resolve(data);
                    }
                    //执行完sql语句后关闭连接。
                    conn.release();
                })
            })
        }).catch(e => {
            //进行报错处理。
            console.log(e);
        })
    }
}

第三部分:引用opreateDB方法

在routes文件夹下的index.js中引用dbconfig中的opreateDB方法访问数据库

index.js文件

var express = require('express');
var router = express.Router();
//导入dbconfig.js文件
var db = require("../util/dbconfig.js");

/* GET home page. */
//修改路由为/login
router.get('/login', function (req, res, next) {
  //编写sql语句
  let sql = "select * from user";
  //第二个参数sqlarr参数没有就传入一个空的参数
  db.opreateDB(sql, []).then(e => {
    //打印查询结果
    console.log(e);
  })
  res.render('index', { title: 'Express' });
});

module.exports = router;

然后启动服务器,在网页上访问localhost/login就可以在vs code的集成终端中看到访问的数据了。

PS F:\T2009小刘(可以参观,请别破坏!!!)\nodeJS课程\node\myseifAPI> node app.js
服务器启动...
GET /login 200 2261.522 ms - 170
GET /stylesheets/style.css 200 10.907 ms - 111
GET /favicon.ico 404 18.638 ms - 1622
[
  RowDataPacket { userId: 1, userName: '刘一', userPwd: '123' },
  RowDataPacket { userId: 2, userName: '陈二', userPwd: '123' },
  RowDataPacket { userId: 3, userName: '张三', userPwd: '123' },
  RowDataPacket { userId: 4, userName: '李四', userPwd: '123' },
  RowDataPacket { userId: 5, userName: '王五', userPwd: '123' },
  RowDataPacket { userId: 6, userName: '赵六', userPwd: '123' },
  RowDataPacket { userId: 7, userName: '孙七', userPwd: '123' },
  RowDataPacket { userId: 8, userName: '周八', userPwd: '123' },
  RowDataPacket { userId: 9, userName: '吴九', userPwd: '123' },
  RowDataPacket { userId: 10, userName: '郑十', userPwd: '123' },
  RowDataPacket { userId: 11, userName: '小张', userPwd: '123' },
  RowDataPacket { userId: 12, userName: '小王', userPwd: '123' },
  RowDataPacket { userId: 13, userName: '小刘', userPwd: '123' }
]

第四部分:解决异步方法的问题

首先现改动一些结构使整个项目更具结构化,把路由里面的index.js改动为里面只写路由,只管理路由,不写任何逻辑代码或者方法

var express = require('express');
var router = express.Router();
//导入dbconfig.js文件
var index = require("../controller/index.js");

/* GET home page. */
//修改路由为/login
//把里面function代码替换成了自己建立的一个专属的控制器controller类里面的一个方法
//指明这个类或者文件中专门只管路由,方法交给controller去管理控制
router.get('/login', index.login);

module.exports = router;

然后再项目里面创建一个controller控制器文件夹或者包

然后再里面创建一个index.js文件,里面的代码专管路由后的逻辑处理代码

在里面创建一个登录方法,在方法前声明这还是一个同步方法

async是声明同步方法的意思,起声明作用

然后再解决db.opreateDB(sql, []);异步的问题,在前面声明await

await是等待db.opreateDB执行结束后才进行下面的程序一个声明,这就是解决异步问题的关键

//导入dbconfig.js文件
var db = require("../util/dbconfig.js");
//创建一个方法
//其中async是声明这是一个同步方法
//await是等待执行完后在执行后面的程序
async function login(req, res) {
    //编写sql语句
    let sql = "select * from user";
    //第二个参数sqlarr参数没有就传入一个空的参数
    //then是执行后等待结果通过回调函数来达到异步改同步的目的
    // db.opreateDB(sql, []).then(e => {
    //   //打印查询结果
    //   console.log(e);
    // })
    let data = await db.opreateDB(sql, []);
    res.send(data);
};

module.exports = {
    login
}

浏览器输出的结果

 第五部分:关于热启动

首先先设置权限,需要打开电脑的window powershell用管理员身份打开

然后输入命令:get-executionpolicy

然就就会输出:

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\Administrator> get-executionpolicy
Restricted
PS C:\Users\Administrator>

如果修改失败可以输入这段命令:set-executionpolicy Remotesigned

PS C:\Users\Administrator> set-executionpolicy Remotesigned

执行策略更改
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170
中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“N”): y
PS C:\Users\Administrator>

注意再打开VS code的时候也尽量用管理员身份打开

然后再VS code的集成终端中安装热启动,输入这段命令:npm install nodemon -g

PS F:\T2009小刘(可以参观,请别破坏!!!)\nodeJS课程\node\myseifAPI> npm install nodemon -g

added 116 packages, and audited 117 packages in 29s

16 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
PS F:\T2009小刘(可以参观,请别破坏!!!)\nodeJS课程\node\myseifAPI> 

这样就安装好了热启动模块了,再启动的时候从node app.js改为nodemon app.js就可以热启动了

第六部分:关于接收参数和带参查询数据

接收参数就用到了req中的一个方法query;他会返回一个对象出来。

然后对象也可以点出来req.query.****;

然后就在浏览器中可以输入http://localhost/login?userName=dowson&userPwd=123

就可以执行成功了。

//导入dbconfig.js文件
var db = require("../util/dbconfig.js");
//创建一个方法
//其中async是声明这是一个同步方法
//await是等待执行完后在执行后面的程序
async function login(req, res) {
    //接收参数
    let {userName,userPwd} = req.query;
    console.log(userName);
    console.log(userPwd);
    //编写sql语句
    let sql = "select * from user where userName=? and userPwd=?";
    //第二个参数sqlarr参数没有就传入一个空的参数
    //then是执行后等待结果通过回调函数来达到异步改同步的目的
    // db.opreateDB(sql, []).then(e => {
    //   //打印查询结果
    //   console.log(e);
    // })
    let data = await db.opreateDB(sql, [userName,userPwd]);
    res.send(data);
};

module.exports = {
    login
}

然后我的sql表

/*
SQLyog Ultimate v12.4.1 (64 bit)
MySQL - 5.7.31-log : Database - liudb
*********************************************************************
*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`liudb` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `liudb`;

/*Table structure for table `user` */

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `userId` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(20) DEFAULT NULL,
  `userPwd` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

/*Data for the table `user` */

insert  into `user`(`userId`,`userName`,`userPwd`) values 
(1,'刘一','123'),
(2,'陈二','123'),
(3,'张三','123'),
(4,'李四','123'),
(5,'王五','123'),
(6,'赵六','123'),
(7,'孙七','123'),
(8,'周八','123'),
(9,'吴九','123'),
(10,'郑十','123'),
(11,'小张','123'),
(12,'小王','123'),
(13,'小刘','123'),
(14,'dowson','123');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

然后今天的学习也就结束了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行呗头发还尚存

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值