序言:
为了真正实现自己上线一个软件 从现在开始学习后端
初入nodejs学到的内容:
首先理解的后端流程大概轮廓是
- 创建服务器
- 编写路由
- 编写路由拦截器(GET、POST)
- 连接数据库
- 实现数据库的增删改查
接着就是学习express.js 和 Koa.js 这两个基于nodejs的框架
我们一步一步来
创建服务器
http.createServer
传入一个方法来创建服务器
该方法入参 request 和 response 即为访问服务器的请求和响应
代码中的writeHead
用于写响应的头部 通过改变Content-Type
来改变响应体的数据类型
对数据的响应 代码中也有体现出来
一种是响应非文件数据 则使用 res.end()
的语法 ,将内容以字符串形式放入进行响应
另外一个响应文件数据,代码中响应一个html文件,则使用fs来创建一个读取流,使用管道pipe将流传入response中
var http = require("http");
var fs = require("fs")
const { stringify } = require("querystring");
var service = http.createServer(function(req , res){
console.log("request");
// 传输数据
res.writeHead(200 , {
// "Content-Type" : 'text/plain' // 传输文本
"Content-Type" : 'text/html' // 传输html
// "Content-Type" : 'application/json' // 传输json
})// 设置请求头
var obj = {
name : "name",
id : "id"
}
// res.end(JSON.stringify(obj))
// 可以利用读取文件进行传输
var myReadStream = fs.createReadStream(__dirname + '/index.html' , 'utf8');
myReadStream.pipe(res)
})
// 监听服务器
service.listen(3000,'127.0.0.1') // 端口以及本地地址
编写路由
我对路由的理解 其实就是使用接口进行请求时 接口的key值
例如 localhost:8000/api/getData 这里的/getData就是路由的主体
通过编写路由来确认 前端请求哪些什么接口获取什么数据
我认为也就是后端与前端的主要连接位置
在这里直接使用一个较为复杂的例子来讲解
首先启动服务器,这里将启动服务的代码封装起来 server.js
var http = require('http');
/**
* 启动服务器
* @param {*} router 路由表与服务器的连接函数
* @param {*} handle 路由表
*/
function startServer(router, handle){
var server = http.createServer(function(request , response){
router(handle,request.url,response)
})
server.listen(3000,'127.0.0.1')
console.log("服务器运行在3000端口上")
}
module.exports = {
startServer
}
在index.js文件中导入
封装的startServer传入两个参数 分别为路由处理方法router以及路由表handle
var server = require('./server.js')
var handler = require('./handle.js')
var router = require('./router.js')
/**
* 相当于路由表 路由对应的端口
*/
var handle = {}
handle['/'] = handler.home
handle['/home'] = handler.home
handle['/user'] = handler.user
server.startServer(router, handle)
可以理解为 handle 来指明你请求的哪个路由对应了哪个路由的响应方法
router 即为他们的操盘手 将 response 和 path 和 handle 结合在一起
因此有handle.js:
var fs = require('fs')
var data = require('./user.js')
// 给予端口 封装端口状态码以及传递的内容(html\json)
function home(response){
response.writeHead(200 , {"Content-Type" : 'text/html'})
fs.createReadStream(__dirname + '/home.html','utf8').pipe(response)
}
function user(response){
response.writeHead(200 , {"Content-Type" : 'application/json'})
response.end(JSON.stringify(data))
}
module.exports = {
home,
user
}
router.js:
var fs = require('fs')
/**
*
* @param {*} handle 路由表
* @param {*} pathname url
* @param {*} response 传入界面接口 将要渲染的内容放入此处
*/
function router(handle,pathname,response){
if(typeof handle[pathname] === 'function'){
handle[pathname](response)
}else{
response.writeHead(404 , {"Content-Type" : "text/html"});
fs.createReadStream(__dirname + "/404.html","utf8").pipe(response);
}
}
module.exports = router
可能有点绕 当时学的时候也花蛮长时间才顺通
路由拦截实现GET、post请求
上一节学习的路由编写里的请求 其实都是get请求 默认如此
而工作中最常见的还是POST请求
首先要认清GET和POST的区别
对于我来说 最大的区别就是POST传参数是在负载中 GET传参数是在路由末尾通过?的形式添加
因此 我们首先需要获取请求中的参数
GET请求获取的思路是截取后面一段url POST是使用库方法直接获取
可以通过request.method
来区分POST还是GET
因此server.js:
var http = require('http');
var url = require('url')
var querystring = require('querystring')
/**
* 启动服务器
* @param {*} router 路由表与服务器的连接函数
* @param {*} handle 路由表
*/
function startServer(router, handle){
var server = http.createServer(function(request , response){
console.log(request.url) // 获取整段url
var pathname = url.parse(request.url).pathname
console.log(pathname) // 获取url中的pathname部分
var data = [] // 用于存储从接口中获取的数据
var params = {} // 用于存储请求中的数据
request.on('error' , function(err){
console.log(err); // 输出报错
}).on('data' , function(chunk){
data.push(chunk) // 存储数据
}).on('end',function(){ // 读取结束
console.log(request.method) // 输出请求类型
if(request.method === 'POST'){
data = Buffer.concat(data).toString(); // 此时被转化为字符串类型
data = querystring.parse(data)
params = data
}else if(request.method === 'GET'){
var param = url.parse(request.url,true).query // 获取url中的参数部分 url?name="xxx" true:【对象】 false:【字符串】
params = param
}else{}
})
// router(handle,request.url,response)
// 为避免服务器连同参数部分一起读取从而无法判断正确url , 应该用pathname部分代替整段url
router(handle,pathname,response,params)
})
server.listen(3000,'127.0.0.1')
console.log("服务器运行在3000端口上")
}
module.exports = {
startServer
}
获取到参数后用params进行装载 通过router传入handle handle再根据params进行特殊处理即可
连接数据库
连接数据库很简单 有个包叫mysql
第一步 安装mysql包
npm install mysql --save--dev
第二步 使用代码进行数据库连接:
const mysql = require('mysql2/promise');
async function connectToDatabase() {
try {
const connection = await mysql.createConnection({
host: 'localhost',
user: 'yourUsername',
database: 'yourDatabaseName',
password: 'yourPassword',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
await connection.connect();
console.log('成功连接到MySQL数据库');
// // 示例:插入数据(INSERT)
// const insertQuery = 'INSERT INTO yourTable (column1, column2) VALUES (?, ?)';
// const insertResult = await connection.execute(insertQuery, ['value1', 'value2']);
// console.log('插入数据成功', insertResult);
// // 示例:查询数据(SELECT)
// const selectQuery = 'SELECT * FROM yourTable WHERE column1 = ?';
// const [rows, fields] = await connection.execute(selectQuery, ['value1']);
// console.log('查询结果', rows);
// // 示例:更新数据(UPDATE)
// const updateQuery = 'UPDATE yourTable SET column2 = ? WHERE column1 = ?';
// const updateResult = await connection.execute(updateQuery, ['newValue', 'value1']);
// console.log('更新数据成功', updateResult.affectedRows);
// // 示例:删除数据(DELETE)
// const deleteQuery = 'DELETE FROM yourTable WHERE column1 = ?';
// const deleteResult = await connection.execute(deleteQuery, ['value1']);
// console.log('删除数据成功', deleteResult.affectedRows);
// 关闭连接
await connection.end();
} catch (error) {
console.error('连接到MySQL数据库时发生错误:', error);
}
}
connectToDatabase();
代码里还写了关于数据库的增删改查的简单方法
ps:此段代码还未运行过 本人另外在express.js框架里也用过该包成功进行数据库连接
nodejs基于webSocket实现聊天功能
主要是之前看别人用go写websocket觉得好高大上 当时自己搞半天都没搞通 现在知道js也可以写后端就赶紧来试着实现
安装 ws
库
首先,你需要通过 npm 安装 ws
库。在你的 Node.js 项目目录下打开终端或命令提示符,然后运行:
npm install ws
创建 WebSocket 服务器
以下是一个简单的 WebSocket 服务器示例,使用 ws
库:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});
console.log('WebSocket server is running on ws://localhost:8080');
在这个例子中,服务器监听 8080 端口,并在每个新的 WebSocket 连接上打印接收到的消息,并向客户端发送一条消息。
创建 WebSocket 客户端
客户端可以使用原生的 WebSocket API,如果你是在浏览器环境中,或者你也可以在 Node.js 中使用 ws
库来模拟客户端:
const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost:8080');
ws.on('open', function open() {
ws.send('Hello Server!');
});
ws.on('message', function incoming(data) {
console.log(data);
});
ws.on('error', function error(err) {
console.error(err);
});
这段代码创建了一个 WebSocket 客户端,连接到 ws://localhost:8080
,发送一条消息,并打印从服务器接收到的任何消息。