1、数据库:

server端:数据存在

client端:管理工具,node

mysql内有两个单位:

库:类似文件夹,容纳表

表:存储数据

行:一条数据

列(字段,域):一个数据项

主键:数据的唯一标识符。唯一的,操作性能高

Nodejs原生不支持mysql

2、SQL

1)增删改查

关键字大写

库名,表名,字段加反引号

分号结尾

增:INSERT

INSERT INTO 表 (字段列表)VALUES(值列表)

INSERT INTO `user` (`id`,`user`,`pwd`)  VALUES(0,'aa','1234');

删:DELETE

改:UPDATE

查:SELECT

SELECT 内容 FROM 表名; 选取查询所有数据

const sql = require('mysql')

//连接
//服务器、用户名、密码、库
let db = sql.createConnection({
host: 'localhost',
user: 'root',
password: '123',
database: 'person'
//还可以配置不同于3306的端口 port
}) //数据库操作是非常典型的异步操作
//查询
//SQL语句,回调
db.query("SELECT * FROM `user_table`",(err,data)=>{
if(err){
console.log('sth goes wrong'+err)
}else{
console.log(JSON.stringify(data))
}
})

2、简单案例:

在进行程序设计之前首先设计数据字典

结合数据库完成相应服务器功能

const express = require('express')
const static = require("express-static")
const cp = require('cookie-parser')
const cs = require('cookie-session')
const bp = require('body-parser')
const multer = require('multer')
const ce = require('consolidate')
const sql=require('mysql') //建立连接池 const db=sql.createPool({
host:'localhost',
user:'root',
password:'123',
database:'blog'
}) //构建服务器
let server = express() //服务器监听
server.listen(8080, function () {
console.log('server is running')
}) //解析cookie
server.use(cp('abc321'))//秘钥 //使用session
let keys = []
for (let i = 0; i < 1000; i++) {
keys.push('keys_' + Math.random())//生成秘钥
}
server.use(cs({
name: 'sess',
keys: keys,
maxAge: 30 * 3600 * 1000
})) //处理post数据
server.use(bp.urlencoded({ extended: false }))//不使用扩展模式,解析url数据
server.use(multer({ dest: './www/upload' }).any()) //配置模板引擎
server.set('view engine','html')//修改server全局配置,修改视图引擎为html
//确认模板位置
server.set('views','./template')
//确认所使用的模板引擎
server.engine('html',ce.ejs) server.get('/',(req,res)=>{
db.query("SELECT * FROM banner",(err,data)=>{
if(err){
//响应状态码
res.status(500).send('wrong:'+err).end()
}else{
console.log(data)
res.render('index.ejs',{banners:data})
}
})
}) //处理静态请求
server.use(static('./www'))
//模板部分
<html> <head>
<title>智能社-http://www.zhinengshe.com</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="description" content=" ">
<meta name="keywords" content="">
<meta name="format-detection" content="telephone=no">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<link href="css/base.css" rel="stylesheet" type="text/css">
<link href="css/index.css" rel="stylesheet" type="text/css">
<script src="js/font.js"></script>
<script type="text/javascript" src="js/jquery-1.7.2.js"></script>
<script type="text/javascript" src="js/swipe.js"></script>
<script>
$(function () {
var mySwipe = Swipe($('.banner')[0], {
auto: 2000,
continuous: true,
stopPropation: true,
callback: function (index, element) {
$('.banner ol li').removeClass('active');
$('.banner ol li').eq(index).addClass('active');
}
});
});
</script>
</head> <body>
<div class="nav">
<ul>
<li class="active"><a href="javascript:;">首页</a></li>
<li><a href="javascript:;">关注</a></li>
<li><a href="javascript:;">栏目</a></li>
</ul>
</div>
<div class="content">
<div class="banner">
<ul class="clearfix">
<% for(var i=0;i<banners.length;i++){ %>
<li>
<img src="<%= banners[i].src %>" alt="" />
<div class="text-box">
<h2><%= banners[i].title %></h2>
<p><%= banners[i].sub_title %></p>
</div>
</li>
<% } %>
</ul>
<ol>
<li class="active"></li>
<li></li>
<li></li>
</ol>
</div>
<div class="newsList">
<ul>
<%for(let i=0;i<articles.length;i++){%>
<li>
<a href="/article?id=<%= articles[i].ID%>"><!-- 传参 -->
<h2><%=articles[i].title%></h2>
<p><%=articles[i].summary%></p>
</a>
</li>
<%}%>
</ul>
</div>
</div>
<div class="foot-btn">
<ul>
<li class="home"><a href="index.html"></a></li>
<li class="write"><a href="javascript:;"></a></li>
<li class="my"><a href="mydoc.html"></a></li>
</ul>
</div>
</body> </html>
//服务器部分
const express = require('express')
const static = require("express-static")
const cp = require('cookie-parser')
const cs = require('cookie-session')
const bp = require('body-parser')
const multer = require('multer')
const ce = require('consolidate')
const sql=require('mysql')
//建立连接池
const db=sql.createPool({
host:'localhost',
user:'root',
password:'123',
database:'blog'
})
//构建服务器
let server = express()
//服务器监听
server.listen(8080, function () {
console.log('server is running')
})
//解析cookie
server.use(cp('abc321'))//秘钥
//使用session
let keys = []
for (let i = 0; i < 1000; i++) {
keys.push('keys_' + Math.random())//生成秘钥
}
server.use(cs({
name: 'sess',
keys: keys,
maxAge: 30 * 3600 * 1000
}))
//处理post数据
server.use(bp.urlencoded({ extended: false }))//不使用扩展模式,解析url数据
server.use(multer({ dest: './www/upload' }).any())
//配置模板引擎
server.set('view engine','html')//修改server全局配置,修改视图引擎为html
//确认模板位置
server.set('views','./template')
//确认所使用的模板引擎
server.engine('html',ce.ejs)
server.get('/',(req,res,next)=>{
db.query("SELECT * FROM banner",(err,data)=>{
if(err){
//响应状态码
res.status(500).send('wrong:'+err).end()
}else{
res.banners=data
next()
}
})
})
server.get('/',(req,res,next)=>{
console.log(res.banners)
db.query("SELECT ID,title,summary FROM article",(err,data)=>{
if(err){
//响应状态码
res.status(500).send('wrong:'+err).end()
}else{
res.articles=data
next()
}
})
})
server.get('/',(req,res)=>{
console.log(res.banners)
db.query("SELECT title,summary FROM article",(err,data)=>{
res.render('index.ejs',{banners:res.banners,articles:res.articles})
})
})
server.get('/article',(req,res)=>{
res.render('conText.ejs',{})
})
//处理静态请求
server.use(static('./www'))

数据库更新语法:

UPDATE 表名 SET 字段=值 WHERE 条件

完整的博客小案例

const express = require('express')
const static = require("express-static")
const cp = require('cookie-parser')
const cs = require('cookie-session')
const bp = require('body-parser')
const multer = require('multer')
const ce = require('consolidate')
const sql = require('mysql')
const timeMod = require('./libs/common')
//建立连接池 const db = sql.createPool({
host: 'localhost',
user: 'root',
password: '123',
database: 'blog'
}) //构建服务器
let server = express() //服务器监听
server.listen(8080, function () {
console.log('server is running')
}) //解析cookie
server.use(cp('abc321'))//秘钥 //使用session
let keys = []
for (let i = 0; i < 1000; i++) {
keys.push('keys_' + Math.random())//生成秘钥
}
server.use(cs({
name: 'sess',
keys: keys,
maxAge: 30 * 3600 * 1000
})) //处理post数据
server.use(bp.urlencoded({ extended: false }))//不使用扩展模式,解析url数据
server.use(multer({ dest: './www/upload' }).any()) //配置模板引擎
server.set('view engine', 'html')//修改server全局配置,修改视图引擎为html
//确认模板位置
server.set('views', './template')
//确认所使用的模板引擎
server.engine('html', ce.ejs) server.get('/', (req, res, next) => {
db.query("SELECT * FROM banner", (err, data) => {
if (err) {
//响应状态码
res.status(500).send('wrong:' + err).end()
} else {
res.banners = data
next()
}
})
}) server.get('/', (req, res, next) => {
console.log(res.banners)
db.query("SELECT ID,title,summary FROM article", (err, data) => {
if (err) {
//响应状态码
res.status(500).send('wrong:' + err).end()
} else {
res.articles = data
next()
}
})
}) server.get('/', (req, res) => {
console.log(res.banners)
db.query("SELECT title,summary FROM article", (err, data) => {
res.render('index.ejs', { banners: res.banners, articles: res.articles })
})
}) server.get('/article', (req, res) => {
if (req.query.id) {
if (req.query.act == 'like') {
db.query(`UPDATE article SET likes=likes+1 WHERE ID=${req.query.id}`, (err, data) => {
if (err) {
res.status(500).send('sth is wrong' + err).end()
} else {
//显示文章
db.query(`SELECT * FROM article WHERE ID=${req.query.id}`,
(err, data) => {
if (err) {
res.status(500).send('文章存在故障').end()
} else {
if (data.length == 0) {//确认文章不为空
res.status(404).send('文章不存在').end()
} else {
res.status(200)
let thisData = data[0]
thisData.date = timeMod.toDate(thisData.post_time)
thisData.content = thisData.content.replace(/^/gm, '<p>').replace(/$/gm, '</p>')
res.render('conText.ejs', {
//使用正则为正文添加段落标签
thisArticle: thisData
})
}
}
}
)
}
})
} else {
db.query(`SELECT * FROM article WHERE ID=${req.query.id}`,
(err, data) => {
if (err) {
res.status(500).send('文章存在故障').end()
} else {
if (data.length == 0) {//确认文章不为空
res.status(404).send('文章不存在').end()
} else {
res.status(200)
let thisData = data[0]
thisData.date = timeMod.toDate(thisData.post_time)
thisData.content = thisData.content.replace(/^/gm, '<p>').replace(/$/gm, '</p>')
res.render('conText.ejs', {
//使用正则为正文添加段落标签
thisArticle: thisData
})
}
}
}
)
} } else {
res.status(404).send('文章不存在').end()
}
}) //处理静态请求
server.use(static('./www'))

node06的更多相关文章

  1. Puppet3在CentOS6.5集群下的安装

    环境:3台主机, IP分别为10.211.55.11.12.13 puppet master安装在10.211.55.11 puppet agent安装在10.211.55.11.12.13 1.安装 ...

  2. 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  3. 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  4. hadoop1.2.1的安装

    前提:1.机器最好都做ssh免密登录,最后在启动hadoop的时候会简单很多 免密登录看免密登录 2.集群中的虚拟机最好都关闭防火墙,否则很麻烦 3集群中的虚拟机中必须安装jdk. 具体安装步骤如下: ...

  5. SSH免费登录

    SSH免费登录很简单,如果有用过git的就更简单了 只需要一下两步操作就OK: 1.生成公钥和私钥,在linx上生成公钥和私钥,执行:ssh-keygen 2.执行ssh-copy-id +ip 例如 ...

  6. Django 数据传递

    在前面的访问数据库中,我们是这样来插入数据的: [root@localhost web]$ cat web/urls.py urlpatterns = patterns('', .... url(r' ...

  7. 032:基于Consul和MGR的MySQL高可用架构

    目录 一.Consul 1.Consul简介 2.准备环境 3.Consul 安装 4.Consul配置文件 5.Consul 服务检查脚本 6.Consul启动 二.MGR搭建 1.MGR配置 2. ...

  8. 031:Cetus sharding

    目录 一.主机环境 二.搭建环境 1.准备环境 三.Cetus安装 1.下载包和安装依赖包 2.Cetus安装 1.安装说明 2.安装实施 四.Cetus配置 1.创建和修改配置文件 2.启动cetu ...

  9. 030:Cetus中间件和MHA读写分离

    030:Cetus中间件和MHA读写分离 line:V1.1 mail: gczheng@139.com date: 2018-08-30 一.主机环境 虚拟机配置 CPU 内存 硬盘 OS版本 My ...

随机推荐

  1. CentOS7.6搭建redis4.0.1 cluster集群

    1. 操作系统信息: $ uname -a Linux iZbp11d57wmumnwuihb2czZ -.el7.x86_64 # SMP Fri Feb :: UTC x86_64 x86_64 ...

  2. centos7 搭建jenkins服务器

    具体可参考:https://blog.csdn.net/it_lihongmin/article/details/80814384 注意: 1. 修改主目录:默认是/var/lib/jenkins,  ...

  3. SQL server查询语句

    作者:邓聪聪 mysql部分语句的查询,持续更新 系统函数 函数名 描述 举例 convert() 数据类型转换 selece convert(varchar(5),12345) 返回:字符串1234 ...

  4. ubuntu命令安装

    1.当make时,发现没有对应的命令: apt-get install build-essential 安装工具,可解决这个问题

  5. Mac环境下 elasticsearch-6.0.1 和 elasticsearch-head 完整安装过程

     安装步骤: 安装java jdk 安装elasticsearch-6.0.1 及中文分词 anslysis-ik-6.0.1 安装elasticsearch-head 下载jdk https://w ...

  6. poj 3268 Silver Cow Party(最短路dijkstra)

    描述: One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the bi ...

  7. js数据结构与算法——二叉树

    function BinaryTree(){ var Node = function(key){ this.key = key; //值 this.left = null; //左箭头 this.ri ...

  8. 【python】使用flask制作小型页面的关键点总结

    目录结构 app.py web代码 store.db 存储信息的轻量数据库,用的sqlite3 schema.sql 数据库的初始化建表语句 settings.cfg 配置信息 static/styl ...

  9. 基于Vue2.x的小米商城移动端项目

    初学vue已经有一段时间,为了检验自己的学习成果,决定做一个项目作为一个阶段性总结,项目花了差不多半个月时间,目前实现了7个页面,商城的主要功能基本实现,代码已经放到github上面. 这个项目把大部 ...

  10. JSP项目前端优化

    问题:在谷歌浏览器中兼容问题,在点击超链接第一次会跳到头部,第二次点击才能打开的问题. 解决方案:是href的问题,删除href的属性,使用click事件,并添加a的超链接样式. #othera{ c ...