node.js

node.js是javascript后端运行环境,无法调用dom,bom浏览器内置api.
可以基于Express框架构建web应用.
可以基于Electron框架构建跨平台桌面应用.
可以基于restify框架构建api接口项目.
在nodejs中执行javascript代码,终端中进入文件所在目录,输入node 空格 要执行的js文件的路径.
fs模块
fs是nodejs官方提供用来操作文件的模块.
fs.readFile方法用来读取指定文件中的内容.
fs.readFile(路径,编码格式,回调函数)
读取成功err错误对象为null,根据err对象是否为null,判断文件是否读取成功.
fs.writeFile方法用来向指定文件中写入内容(也可以创建文件,不能创建路径,重复执行会覆盖之前的内容).
fs.writeFile(路径,写入内容,编码格式,回调函数)
写入成功err错误对象为null,根据err对象是否为null,判断文件是否写入成功.

fs路径拼接
相对路径动态拼接会出错。
绝对路径维护性差。
推荐使用__dirname表示当前文件所处的目录(绝对路径)
path模块
path.join(__dirname,‘路径’)使用这种方式进行拼接
path.basename(‘文件路径’,‘文件扩展名’),从文件路径中获取文件名,可以通过第二个参数消除扩展名。
http模块
可以安装web服务器软件,例如lls,Apache把普通电脑变成服务器。在node.js中通过http模块写服务器软件。
http.createServer(),用来创建web服务器实例。

const http = require('http') // 导入http模块
const server = http.createServer() // 创建web服务器实例
server.on('request',(req,res) => {
const str = '你好'
// req是请求对象,包含与服务器相关的数据和属性,如req.url客户端请求的url地址 req.method客户端的请求类型
// res是响应对象,res.end()向客户端响应指定的内容,并结束这次请求。
res.end(str)
// 设置Content-Type响应头,解决中文乱码问题
res.setHeader('Content-Type''text/html; charset=utf-8')
}) // 为服务器绑定request事件
server.listen(80,() => {}) // 启动服务器server.listen(端口号,() => {}0)

模块化

const fs = require('fs) // 加载内置模块
const custom = require('./custom.js') // 加载自定义模块
const moment = require('moment ') // 加载第三方模块

模块作用域,防止变量污染。
module对象存储当前模块信息。
module.exports对象存储向外暴露信息。
exports对象默认和module.exports指向同一对象,不指向同一对象时以module.exports为准。
使用require()方法导入的就是module.exports对象
npm
npm install 或者 npm i 安装包
包结构规范:
包必须以单独的目录存在,
包的顶级目录下必须包含package.json包管理配置文件
package.json中必须包含name,version,main包名称,包版本号,包入口文件这三个属性。
npm login 登录npm账号
在包的根目录 npm publish 发布包 npm publish – force 删除包
模块有缓存机制,多次调用 require() 不会导致模块的代码被执行多次。会优先从缓存中加载。提高模块的加载效率。
内置模块优先级最高,同名模块会执行内置模块。
加载自定义模块必须以./或者…/开头,node.js会按顺序加载自定义模块:按确切文件名加载,补全.js扩展名加载,
补全.json扩展名加载,补全.node扩展名加载,最后按以上顺序找不到,加载失败,终端报错。
第三方模块加载
从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块。如果没有找到,则移动到上一层父目录中,进行加载,直到文件系统的根目录。最后按以上顺序找不到,加载失败,终端报错。
目录作为模块
在被加载的目录下查找package.json文件,寻找main属性,作为 require() 加载的入口。如果没有package.json文件,或者main属性无法解析,node.js会加载目录下index.js文件。最后按以上顺序找不到,加载失败,终端报错。
Express

const express = require('express')
const app = express()
app.listen(80,()=>{}) // app.listen(端口号,()=>{})
app.get('url:id',(req,res)=>{
req.query // req.query是个空对象,包含url中携带的参数
req.params // req.params,包含url中携带的动态参数( :id)
res.send()}) // app.get('路径',()=>{})
app.post('url',(req,res)=>{res.send()}) // app.get('路径',()=>{})
// req是请求对象,包含与服务器相关的数据和属性,如req.url客户端请求的url地址 req.method客户端的请求类型
// res是响应对象,res.send()向客户端响应指定的内容,并结束这次请求。
app.use('/public',express.static('public'))
// express.static() 静态资源服务器 多个静态资源会按顺序查找,参数不会添加在路径中
// '/public'挂载路径前缀

模块化路由挂载

const express = require('express') // 导入express
const router = express.Router() // 创建路由对象
router.get('url',(req,res)=>{res.send()}) // 挂载路由
module.exports = router // 暴露路由对象

注册路由模块

const express = require('express')
const userRouter = require('./router.js')
const app = express()
app.use('url',userRouter)
// app.use()注册全局中间件

中间件本质就是一个函数,必须要有一个next函数作为参数,中间件用来处理部分逻辑。
通过app.use()注册的是全局中间件,在路由第二个参数注册是局部中间件,多个用数组包裹。

a = () => {}
b = () => {}
app.use(a) // 全局中间件
router.get('url',[a,b],(req,res)=>{res.send()}) // 局部中间件

cors跨域

const cors = require('cors')
app.use(cors()) // 使用cors中间件解决跨域

Access-Control-Allow-Origin 允许访问该资源的外域url
Access-Control-Allow-Headers 对额外的请求头进行声明
Access-Control-Allow-Methods 指明请求所使用的http方式
MySQL
使用MySQL Workbench管理数据库
dataType数据类型
int整数,varchar字符串,tinyint布尔值
字段的特殊标识
PK 主键,唯一标识
NN 值不允许为空
UQ 值唯一
AI 值自增长
select username,password from users 从users 中查询username,password数据。
insert into users (username,password) values (‘tom’,‘123’) 向users中插入新数据,username值为tom,password值为123。
update users set password=‘123456’ where id=4 将id为4的用户密码,更改为123456
delete from users where id=4
lect from users order by id desc 按照id对结果进行降序排列,asc表示升序排列(默认情况就是升序)
select count(*) from users where status=0 进行统计
select count(*) as total from users where status=0 使用as关键字给列起别名
and运算符 多个条件同时满足 where and
or运算符 多个条件满足一个 where or

const mysql = require('mysql') // 导入mysql模块
const db = mysql.createPool({
host: '127.0.0.1', // 数据库的ip地址
user: 'root', // 登录数据库的账号
password: '123456', // 登录数据库的密码
database: 'my_db_01' // 指定要操作那个数据库
})
let user = {username:'张三',password:'123'}
let sqlStr = 'insert into users (username,password) values (?,?)'
db.query(sqlStr,[user.username, user.password],()=>{})

前后端的身份认证
服务器端渲染推荐 Session认证机制,需要配合Cookie才能实现。
Cookie不支持跨域,涉及到跨域时需要额外配置。
不同域名下的Cookie各自独立,客户端发送请求时,
自动发送把当前域名下的所有未过期的Cookie通过请求头形式一同发送到服务器。

前后端分离推荐使用JWT认证机制
JWT通常由Header.Payload.Signature三部分组成。
Payload部分是用户信息,它是经过加密的字符串
Header和Signature是安全性相关的部分,只是为了保证Token的安全性。
推荐做法是把JWT放在请求头Authorization字段中

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值