Node.js 连接数据库

351 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

Node.js 连接数据库前,需要手动创建数据库,如果你想知道如何快速简单使用 mysql 数据库,可以参考另一篇文章快速创建一个 mysql 数据库

nodejs 数据库直连

mysql 数据库连接使用到 mysql 包,首先 npm i mysql

数据库直连使用 createConnection 方法,当查询等操作结束,需要使用 connection.end() 关闭连接

const mysql = require("mysql")

const connection = mysql.createConnection({
    host: "127.0.0.1",
    port: 3306,
    user: 'root',
    password: 'lin.123123',
    database: "jerry"
})

connection.connect();

connection.query("select * from friend", function (err, result, field) {
    if (err) throw err;

    console.log(result);
    console.log(field);
})

connection.end();

执行成功,控制台输出 jerry 表的信息:

image.png

node.js 数据库连接池

创建数据库连接需要消耗较多的资源和时间,在使用数据库时,可以创建数据库连接池,一次性创建一定数量的连接并维护和复用这些连接,可以节省资源和提升效率。

创建连接池使用 createPool 方法,用 pool.getConnection 从连接池里获取连接,并在使用完当前连接后将其释放 connection.release

const mysql = require('mysql');
const pool = mysql.createPool({
    connectionLimit: 10,
    host: "127.0.0.1",
    port: 3306,
    user: 'root',
    password: 'lin.123123',
    database: "jerry"
});

pool.getConnection((error, connection) => {
    connection.query("select * from friend", function (err, result, field) {
        connection.release();
        if (err) throw err;
        console.log(result);
        console.log(field);
    })
})

转义查询

为了防止 sql 注入,需要对用户输入的内容做转义处理。

mysqljs 使用 ? 作为替代符:

pool.getConnection((error, connection) => {
   connection.query("select * from friend where name = ? and sex = ?", ['lin','男'], function (err, result, field) {
       connection.release();
       if (err) throw err;
       console.log(result);
   })
})

实例:登录表单验证

首先用 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>
</head>
<body>
    <form action="http://127.0.0.1:3000" method="post">
        username:
        <input type="text" name="username" id="username">
        passowrd:
        <input type="text" name="password" id="password">
        <button>submit</button>
    </form>
</body>
</html>

image.png node 获取 form 表单发送的 http 请求:

const http = require("http");
http.createServer((req, res) => {

    let post = ""
    req.on("data", chunk => {
        post += chunk
    })
    req.on("end", () => {
        res.write(post);
        const params = new URLSearchParams(post);
        const username = params.get("username");
        const password = params.get("password");
        console.log(post); // username=jerry&password=123456
        console.log(username);// jerry
        console.log(password);// 123456
        res.end();
    })
}).listen(3000)

请求是以 form data 的方式发出,获取到的是 username=jerry&password=123456,可以使用 URLSearchParams 进行解析。

接下来就是连接数据库判断请求结果是否成功,并通过 res 将请求结果返回给客户端,完成代码如下:

const http = require("http");
const mysql = require("mysql");

const pool = mysql.createPool({
    connectionLimit: 10,
    host: "127.0.0.1",
    port: 3306,
    user: 'root',
    password: 'lin.123123',
    database: "jerry"
});


http.createServer((req, res) => {

    let post = ""
    req.on("data", chunk => {
        post += chunk
    })
    req.on("end", () => {
        const params = new URLSearchParams(post);
        const username = params.get("username");
        const password = params.get("password");
        pool.getConnection((error, connection) => {
            connection.query("select * from friend where name = ? and password = ?", [username, password], function (err, data, field) {
                connection.release();
                if (err) throw err;
                if (data.length > 0) {
                    res.writeHead(200, {
                        "Content-Type": "text/html;charset=utf8"
                    });
                    res.write("登录成功");
                    res.end();
                }
            })
        })
    })
}).listen(3000)

参考

mysqljs