node06
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>
//服务器部分
数据库更新语法:
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的更多相关文章
- 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.安装 ...
- 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- hadoop1.2.1的安装
前提:1.机器最好都做ssh免密登录,最后在启动hadoop的时候会简单很多 免密登录看免密登录 2.集群中的虚拟机最好都关闭防火墙,否则很麻烦 3集群中的虚拟机中必须安装jdk. 具体安装步骤如下: ...
- SSH免费登录
SSH免费登录很简单,如果有用过git的就更简单了 只需要一下两步操作就OK: 1.生成公钥和私钥,在linx上生成公钥和私钥,执行:ssh-keygen 2.执行ssh-copy-id +ip 例如 ...
- Django 数据传递
在前面的访问数据库中,我们是这样来插入数据的: [root@localhost web]$ cat web/urls.py urlpatterns = patterns('', .... url(r' ...
- 032:基于Consul和MGR的MySQL高可用架构
目录 一.Consul 1.Consul简介 2.准备环境 3.Consul 安装 4.Consul配置文件 5.Consul 服务检查脚本 6.Consul启动 二.MGR搭建 1.MGR配置 2. ...
- 031:Cetus sharding
目录 一.主机环境 二.搭建环境 1.准备环境 三.Cetus安装 1.下载包和安装依赖包 2.Cetus安装 1.安装说明 2.安装实施 四.Cetus配置 1.创建和修改配置文件 2.启动cetu ...
- 030:Cetus中间件和MHA读写分离
030:Cetus中间件和MHA读写分离 line:V1.1 mail: gczheng@139.com date: 2018-08-30 一.主机环境 虚拟机配置 CPU 内存 硬盘 OS版本 My ...
随机推荐
- Linux-ubuntu16.04安装 mysql5.7-PHP7.0+Swoole
步骤1 – 安装MySQL 在 Ubuntu 16.04 中,默认情况下,只有最新版本的 MySQL 包含在 APT 软件包存储库中.只需更新服务器上的包索引并安装默认包 apt-get. sudo ...
- The base and high address of the custom IP are not correctly reflected in xparameters.h in SDK
This issue has been observed in 2015.3, 2015.4, and 2015.4.1 builds of Vivado. When you create and a ...
- 8266编译错误 xtensa-lx106-elf/bin/ld: segmentled section `.text' will not fit in region `iram1_0_seg'
一种简单的解决办法 Okay, the solution was to copy the libgcc.a file from: esp-open-sdk/ESP8266_NONOS/lib/ to ...
- tensorflow调试tfdbg
tensorflow调试工具:tfdbg 使用教程:https://www.cnblogs.com/hellcat/articles/7812119.html 遇到的错误信息及解决方案 ModuleN ...
- axios 拦截器统一在接口增加时间戳参数,防止走缓存。
request.interceptors.request.use( config => { if (config.method == 'post') { config.data = { ...c ...
- servlet九大内置对象和监听器
对象名称 类型 描述 作用域 request javax.servlet.ServletRequest 表示一次用户请求 Request response javax.servlet.SrvletRe ...
- Python 包管理(PYPA)
Python包的管理可以通过Python 自带的管理 工具,例如:package-autoremove,package-list-packages, package-install 等,使用起来也非常 ...
- 末学者笔记--NFS服务和DHCP服务讲解
NFS服务端概述 一.概念: NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS:NFS允许一个系统在网络上与他 ...
- 转导推理——Transductive Learning
在统计学习中,转导推理(Transductive Inference)是一种通过观察特定的训练样本,进而预测特定的测试样本的方法.另一方面,归纳推理(Induction Inference)先从训练样 ...
- pyqt5与QML开发小结
遇见的坑 qt 5.11 与 qt 5.12 中Qquick的差异还是蛮大的,由开发环境:Pyqt5.11 + Qt5.12 部署到 Pyqt5.11 + Qt5.11时遇到以下问题: 1.当一个It ...