前端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: '退出成功' })
})

 

 

 

posted @ 2022-09-24 09:37  HM-7  阅读(42)  评论(0)    收藏  举报