前端Node.js-Day38
mysql操作数据库
如果sql语句有多个占位符?,则query语句参数必须为数组形式传入为每一个占位符指定值,如果只有一个则可以省略数组符。
查询语句:使用select查询,得到的结果res是数组形式。
db.query('select * from seven', (err, res) => {
// 查询失败
if (err) return console.log('Error!' + err.message)
// 查询成功
console.log(res)
})
const sqlStr = 'select * from stuinfo'
db.query(sqlStr, (err, res) => {
if (err) return console.log(err.message)
console.log(res)
})
插入语句:insert into 表名(值,值)values(?,?)如果回调函数result的affectRows的值为1则说明插入成功!
通过insert into插入,得到的结果res是对象形式。
// 插入
const user = {name: 'lwh', content: 'Nice!'}
const sqlStr2 = 'insert into seven(name, content) values (?, ?)'
db.query(sqlStr2, [user.name, user.content], (err, result) => {
if (err) return console.log(err.message)
else if (result.affectedRows === 1) console.log('插入成功!')
})
插入语句的便捷方式:(如果插入数据和表中属性一一对应时可以使用!)insert into 表名 set ?
// 插入便捷方式
const user2 = {name: 'lwhs', content: 'apple'}
const sqlStr3 = 'insert into seven set ?'
db.query(sqlStr3, user2, (err, results) => {
if (err) return console.log(err.message)
else if (results.affectedRows === 1) console.log('插入成功!')
})
更新语句:update 表名 set username=?,password=?,...... where id=?
// 更新操作
const user3 = {id: 1, name: 'lll', content: 'abc'}
const sqlStr4 = 'update seven set name=?,content=? where id=?'
db.query(sqlStr4, [user3.name, user3.content, user3.id], (err, results) => {
if (err) return console.log(err.message)
else if (results.affectedRows === 1) return console.log('更新成功!')
})
更新语句便捷方式:(如果更新数据与表内属性一一对应则可以使用)update 表名 set ? where id = ?
query内的参数还是以数组方式输入!
const user4 = {id: 4, name: 'sac', content: 'quite'}
const sqlStr5 = 'update seven set ? where id=?'
db.query(sqlStr5, [user4, user4.id], (err, results) => {
if (err) return console.log(err.message)
else if (results.affectedRows === 1) console.log('更新成功!')
})
删除语句:delete from 表名 where id=?
通过delete语句得到的结果results也是对象形式。
// 删除数据
const sqlStr6 = 'delete from seven where id=?'
db.query(sqlStr6, 7, (err, results) => {
if (err) return console.log(err.message)
else if (results.affectedRows === 1) console.log('删除成功!')
})
标记删除:delete会永久真正的删除数据,使用标记删除来模拟删除过程。设置一个status状态字段,标记当前语句是否被删除。
db.query('update users set status=1 where id=?', 7, (err, results) => {
...
})
Web开发模式:
① 服务端渲染:服务器发送给客户端的HTML页面,是在服务器通过字符串拼接,动态生成的。故客户端不需要Ajax来额外请求页面数据。
app.get('/index.html', (req, res) => {
// 要渲染的数据
const user = {name:'lwh', age:'18'}
// 服务器通过字符串拼接,动态生成HTML页面内容
const htmlStr = `My name is ${user.name} and age is ${user.age}!`
// 服务器将生成的页面响应给客户端,客户拿到的即真实数据
res.send(htmlStr)
})
优点:
- 前端耗时少,浏览器只需直接渲染页面,无需额外请求数据。
- 有利于SEO,服务器响应的是完整的 HTML 页面内容,有利于爬虫爬取信息。
缺点:
- 占用服务器资源,服务器需要完成页面内容的拼接,若请求比较多,会对服务器造成一定访问压力。
- 不利于前后端分离,开发效率低。
② 前后端分离:前后端分离技术,依赖于Ajax的应用。即后端只提供API接口,前端利用Ajax进行调用。
优点:
- 开发体验好,前端专注于UI页面的开发,后端专注于API的开发,前端具有更多选择性。
- 用户体验好,利用Ajax实现页面局部刷新。
- 减轻了服务器端的渲染压力,页面最终在用户浏览器生成。
缺点:
- 不利于SEO,完整的 HTML 页面在浏览器拼接完成,因此爬虫无法爬取页面的有效信息。Vue、React 等框架的 SSR(server side render)技术能解决 SEO 问题。
如何选择:
- 企业级网站,主要功能是展示,没有复杂交互,且需要良好的 SEO,可考虑服务端渲染
- 后台管理项目,交互性强,无需考虑 SEO,可使用前后端分离
- 为同时兼顾首页渲染速度和前后端分离开发效率,可采用首屏服务器端渲染+其他页面前后端分离的开发模式
HTTP协议的无状态性:客户端的每次HTTP请求都是相互独立的,服务器不会主动保留每次HTTP请求的状态。
突破HTTP协议的无状态性:利用cookie‘
Cookie:存储在用户浏览器中4kb大小的字符串,由名称(Name)、值(Value)和其他几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。(不同域名下的cookie相互独立)每当客户端发起请求,会自动将该域名下所有未过期的Cookie发送至服务器。
身份认证:指通过一定手段完成对用户身份的确认,分为session认证,jwt认证。服务端渲染推荐使用session认证,前后端分离推荐使用jwt认证。
session认证机制:
Session中间件的使用:
1.安装Express-Session:npm install express-session
2.配置Express-Session:
const session = require('express-session')
app.use(session({
secret: 'keyboard cat', // secret的值可以为任意字符串
resave: false, // 固定写法
saveUninitialized: true // 固定写法
}))
3.向Session存入数据:当express-session配置成功后,req对象才具有session属性:
// 向Session存储数据
app.post('/api/post', (req, res) => {
if (req.body.username !== 'lwh' || req.body.password !== '000000') {
return res.send({status: 1, msg: '登录失败!'})
}
// 将登录成功后的用户信息存入Session中
req.session.user = req.body
req.session.isLogin = true
res.send({status: 0, msg: '登录成功!'})
})
4.从Session取出数据:
// 从Session中取出数据
app.get('/api/get', (req, res) => {
if (!req.session.isLogin) {
return res.send({ status: 1, msg: '未登录' })
}
res.send({ status: 0, msg: 'success', username: req.session.user.username })
})
5.清空Session:req.session.destory() 只会清空当前用户的Session,不会清空其他用户的Session
// 清空Session
app.post('/api/logout', (req, res) => {
req.session.destroy()
res.send({ status: 0, msg: '退出成功' })
})