首页 > 编程语言 >初入nodejs

初入nodejs

时间:2024-08-29 17:17:11浏览次数:4  
标签:function handle nodejs url 初入 ws var response

序言:

为了真正实现自己上线一个软件 从现在开始学习后端

初入nodejs学到的内容:

首先理解的后端流程大概轮廓是

  1. 创建服务器
  2. 编写路由
  3. 编写路由拦截器(GET、POST)
  4. 连接数据库
  5. 实现数据库的增删改查

接着就是学习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,发送一条消息,并打印从服务器接收到的任何消息。

标签:function,handle,nodejs,url,初入,ws,var,response
From: https://www.cnblogs.com/ZhongGL/p/18385219

相关文章

  • gyp GET https://nodejs.org/download/release/v20.15.0/node-v20.15.0-headers.tar.g
    如图我执行yarn关于node会报错:gyphttpGEThttps://nodejs.org/download/release/v20.15.0/node-v20.15.0-headers.tar.gzgyphttpfetchGEThttps://nodejs.org/download/release/v20.15.0/node-v20.15.0-headers.tar.gzattempt1failedwithETIMEDOUTgypWARNins......
  • 会员通知短信怎么利用NodeJS发送短信
    会员通知群发短信以其即时高效、高打开率、个性化定制、成本效益高、跨平台兼容以及法律合规等优势,在现代会员管理和营销策略中占据了重要地位。对于希望提升会员沟通效率、增强用户粘性和促进业务增长的企业而言,合理利用群发短信工具无疑是一个明智的选择。支持免费试用下乐......
  • win版本nodejs切换版本
    在Windows系统上,使用Node.js版本管理器nvm(NodeVersionManager)可以轻松切换Node.js版本。以下是安装和使用nvm的步骤:下载nvm安装器:访问https://github.com/coreybutler/nvm-windows/releases,下载最新的nvm-setup.zip文件。安装nvm:下载完成后,解压并运行nvm-setup.exe,按照向......
  • 基于nodejs+vue北京冬奥会志愿者管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着2022年北京冬奥会的日益临近,志愿者作为赛事成功举办不可或缺的重要力量,其管理效率与服务质量直接关系到冬奥会的整体形象与国际影响力。传统的人工管理......
  • 基于nodejs+vue北朝艺术博物馆文物在线观赏系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着数字时代的到来,互联网技术的飞速发展正深刻改变着人们的生活方式与文化体验。北朝艺术,作为中国古代文化艺术的重要组成部分,其丰富的历史底蕴与艺术价值......
  • 基于nodejs+vue报刊杂志订阅系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,数字化阅读逐渐普及,但传统报刊杂志作为信息传播的重要载体,其订阅服务依然占据不可或缺的地位。特别是在学术、专业领域及特定兴趣群......
  • 基于nodejs+vue北京冬奥会志愿者管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着北京冬奥会的日益临近,作为全球瞩目的体育盛事,其成功举办不仅依赖于高水平的竞技比赛,更离不开一支高效、专业、热忱的志愿者队伍。志愿者作为连接赛事与......
  • 安装nvm,并通过nvm安装nodejs
    转载请注明出处:1.安装nvm打开终端,然后运行以下命令来下载并安装nvm:curl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh|bash              或者使用wget:wget-qO-https://raw.githubusercontent.com/nvm-......
  • 基于nodejs的本地文件增删改查的工具代码
    一、代码封装这是一个使用node.js实现的对本地文件进行增删改查的工具代码封装,其中代码结尾包含了使用方法示例,具体封装代码如下://jsonTool.jsconstfs=require('fs');constpath=require('path');//定义JSON文件的路径constfilePath=path.join(__dirname,'........
  • nodeJS中的事件机制
    events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http、fs等。本文将详细介绍nodeJS中的事件机制EventEmitter多数Node.js核心API都是采用惯用的异步事件驱动架构,其中某些类型的对象(称为触发器)会周期性地触发命名事件来调用函数对象(监听器)。例......