Skip to content

Node.js + 微信小程序

约 1234 字大约 4 分钟

微信小程序Node.js

2025-04-22

wechat node

本文主要介绍如何使用 node 完成一些后端业务的开发,例如 数据库连接,发送邮件验证码。

使用 node 连接本地数据库

  1. 安装 node.js

前往官网下载 node.js。

安装成功后,使用命令查看 node 版本:

node -v

出现版本号,说明 node 已经安装成功。同时,npm 也已经安装成功,可以输入 npm -v 查看版本号。

  1. 安装依赖

在你的计算机任何地方创建一个文件夹(可以在微信小程序根目录),进入文件夹 右键 在终端中打开,依次输入以下命令:

初始化项目,将会自动创建 package.json 配置文件:

npm init -y

安装 Express 框架,用于快速创建HTTP服务器:

npm install express --save

安装 mysql 的软件包:

npm install mysql --save

安装 cors 跨域中间件:

npm install cors --save
  1. 创建数据库连接文件

进行此步之前,请确保已经创建好数据库和表,并数据库连接正常。

在文件夹下创建 server.js ,输入以下代码:

const express = require('express');
const mysql = require('mysql');
const cors = require('cors');
const app = express();
app.use(cors());

// 数据库配置
const db = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'database name'
});

// 连接数据库
db.connect(err => {
  if (err) throw err;
  console.log('MySQL connected');
});

// 路由 获取全部用户
app.get('/allusers', (req, res) => {
  const sql = 'SELECT * FROM tb_user';
  db.query(sql, (err, result) => {
    if (err) throw err;
    res.json({ code: 200, data: result });
  });
});
// 路由 根据id获取用户
app.get('/user/:id', (req, res) => {
    // 验证ID格式
    const userId = parseInt(req.params.id);
    if (isNaN(userId)) {
        return res.status(400).json({
            code: 400,
            message: 'Invalid book ID format'
        });
    }

    // 使用参数化查询防止SQL注入
    const sql = 'SELECT * FROM tb_user WHERE id = ?';
    db.query(sql, [userId], (err, result) => {
        if (err) {
            console.error('Database error:', err);
            return res.status(500).json({
                code: 500,
                message: 'Database query failed'
            });
        }

        if (result.length === 0) {
            return res.status(404).json({
                code: 404,
                message: 'Book not found'
            });
        }

        // 返回查询到的第一条记录
        res.json({ code: 200, data: result[0] });
    });
});
app.listen(3000, () => console.log("Server running on port 3000"));
  1. 启动服务

在文件夹中 打开 终端,输入以下命令:

node server.js
  1. 访问请求测试 可以在浏览器中访问 http://localhost:3000/allusers ,如果看到返回的数据,说明连接成功。

或在小程序中进行请求:

// 所有用户
wx.request({
    url: 'http://localhost:3000/allusers',
    methods: 'GET',
    success: res => {
        console.log(res.data);
    }
})
// 根据id获取用户
wx.request({
    url: 'http://localhost:3000/user/'+userid,
    methods: 'GET',
    success: res => {
        console.log(res.data);
    }
})

问题

  1. Client does not support authentication protocol requested by server...

这是由于最新的 MySQL 模块并未完全支持 MySQL 8.0caching_sha2_password 加密方式,而 MySQL 8.0 中默认仍然是 caching_sha2_password 加密方式,因此用户认证不通过。

可以通过指令方式修改:

mysql> alter user 'root'@'localhost' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.01 sec)

使用 node 发送邮箱验证码

  1. 获取授权码
  • 首先使用个人账号登录网页版QQ邮箱
  • 登录后找到设置,点击设置
  • 进入设置,点击账号
  • 找到并勾选SMTP发信后保存到服务器
  • 找到管理服务并点击
  • 进到账号与安全,往下拉,找到并点击生成授权码,然后进行短信验证
  • 验证通过,生成授权码,复制授权码
  1. 安装依赖

先确保成功安装 node 后,安装 nodemailer 邮件发送软件包:

npm install nodemailer --save

安装 Express 框架,用于快速创建HTTP服务器:

npm install express --save
  1. 创建邮箱连接文件
const express = require('express');
const nodemailer = require('nodemailer'); // 邮件模块
const app = express();

app.use(express.json()); // JSON解析中间件
app.use(express.urlencoded({ extended: true })); // URL编码解析

// 邮件传输器配置
const transporter = nodemailer.createTransport({
  host: "smtp.qq.com", // QQ邮箱SMTP服务器
  port: 465, // SSL端口
  secure: true, // 使用SSL
  auth: {
    user: '[email protected]', // 发送邮箱
    pass: 'XXXX' // 邮箱授权码
  }
});

// 生成6位随机验证码
function generateVerificationCode() {
  return Math.floor(100000 + Math.random() * 900000).toString();
}

// 发送验证码接口
app.post('/sendcode', (req, res) => {
  const email = req.body.email; // 从前端获取邮箱地址
  const verificationCode = generateVerificationCode();

//   // 配置邮件内容
  const mailOptions = {
    from: '"XXXX" <[email protected]>', // 发件人信息
    to: email, // 收件人邮箱
    subject: '您的验证码', // 邮件主题
    text: `您的验证码是:${verificationCode},3分钟内有效`, // 纯文本内容
    html: `<b>${verificationCode}</b><p>该验证码3分钟内有效</p>` // HTML内容
  };

// 发送邮件
  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      console.error('发送失败:', error);
      return res.status(500).json({ code: 500, message: '验证码发送失败' });
    }
    console.log('验证码已发送:', info.messageId);
    res.json({ code: 200, message: '验证码已发送至邮箱' });
  });
});

app.listen(3000, () => console.log("Server running on port 3000"));

在进行测试访问之前,同样需要先启动服务:

node server.js

由于 /sendcode 验证码接口是 POST 请求,不能直接通过浏览器测试,可以使用 postman 进行测试,或通过小程序 wx.request 完成请求:

wx.request({
    url: 'http://localhost:3000/sendcode',
    methods: 'POST',
    data:{
        email: this.data.email
    },
    success: res => {
        console.log(res.data);
    }
})