将js进行到底:node学习10
node.js数据库篇——MySQL
NoSQL大行其道的如今,MySQL这样的关系型数据库依然有着不可撼动的位置,对于中型,大型面向对象的项目,关系型数据库依然是首选,真正的项目,应当是将数据库的任务分离给专门的数据库工程师去完成。
本回介绍使用node.js连接mysql数据库,基于前面的express框架构建简单的购物车example。
node.js的MySQL驱动
数据库驱动是语言连接数据库的必备库,node.js连接mysql的基本驱动叫做“node-mysql”,另外node npm社区也提供了MySQL ORM的数据库驱动,就类似于上一回中的mongoose,基于模型映射的操作方式,叫做“node-sequelize”,性能相对于原生驱动肯定要差不少。
package.json
{
"name":"shopcart",
"version":"0.0.1",
"description":"a shopcart example powered by express and mysql",
"dependencies":{
"express":"latest",
"mysql":"latest",
"sequelize":"latest",
"jade":"latest"
}
}
测试连接
直接采用官方提供的连接示例:
var mysql = require('mysql');
//创建并配置连接参数
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'cslg'
});
//连接
connection.connect();
//测试查询语句,使用query输入SQL语句
connection.query('SELECT * from teacher_base_info limit 10', function (error, results, fields) {
if (error) throw error;
console.log(results);
});
//断开连接
connection.end();
读取成功
实践——购物车实现
需求分析
算了算,大概需要如下几个基本功能
- /:展示所有商品以及添加商品的表单
- /projects(POST):创建项目
- /delete/:id(DELETE):删除项目
- /project:/:id(GET):展示某个商品详情
为了示例简单,只做这几个功能罢了
创建数据库
使用phpmyadmin或者手动创建一个库,一张表
数据库叫:shopcart
表名:items
数据库配置文件
在开发项目时,应该将数据库账号密码的配置文件单独放在配置文件中,所以在项目目录下先新建dbconfig.json,使用json是因为js方便读取。
dbconfig.json
{
"host" : "localhost",
"user" : "root",
"password" : "",
"database" : "shopcart"
}
server.js
var mysql = require('mysql');//引入mysql驱动
var dbconfig = require("./dbconfig.json");//引入数据库配置文件
var express = require("express")
var bodyParser = require('body-parser');
var app = express();
var connection = mysql.createConnection(dbconfig);
//express框架基本配置
app.use(bodyParser.urlencoded({ extended: true })); //对post请求表单提交的数据编码,否则服务器端无法获得
app.set("view engine","jade");
app.set("views",__dirname+"/views");
connection.connect();
//主页
app.get("/",function(req,res){
connection.query('SELECT * from items', function(err, data, fields) {
if(err) throw err;
res.render("index",{items:data});
});
})
//删除一件商品
app.get("/delete/:id",function(req,res){
var id = req.params.id;
connection.query("delete from items where id=?",id,function(err,data,fields){
//affectedRows可查看删除行数
console.log(data.affectedRows);
res.redirect("/");
});
});
//插入一件商品
app.post("/projects",function(req,res){
console.log(req.body);
connection.query("insert into items SET ?",req.body,function(err, data, fields){
if(err) throw err;
//insertId可查看插入行的主键id编号
console.log(data.insertId);
res.redirect("/");
});
});
app.listen(3000);
分析套路
事实上在使用后我发现node-mysql模块使用十分简单:
- 引入mysql模块,createConnection创建连接,传入配置文件json
- 在请求代码前就连接上mysql,不要将connect放到get,post中,最后也不用关闭
- 使用query操作数据库,第一个参数为数据库语句,可以使用“?”为占位符,第二个参数为替代占位符的对象,或者单一变量
- 最后一个参数为回调函数,其中第二个参数是数据库返回的结果
从头到尾只使用一个query方法,传入数据库语句,回调函数获取数据即可,非常简单
前端文件
layout.jade
doctype html
html
head
title My shopping cart
body
h1 My shopping cart
#cart
block body
index.jade
extends layout
block body
h2 所有商品
if(items.length)
ul
each item in items
li
h3: a(href="/project/#{item.id}")=item.title
p=item.description
span: a(href="/delete/#{item.id}") 删除
else
p 没有任何商品
h2 创建新的商品
form(action="/projects",method="POST")
p
label 标题
input(type="text",name="title")
p
label 详情
textarea(name="description")
p
button 提交