一起养成写作习惯!这是我参与「掘金日新计划 · 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 表的信息:
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>
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)