2024 / 02.02 :
补充 : 当前已添加其他功能,例如操作系统打开应用、发送系统通知、锁定系统屏幕、调整系统音量、调整系统亮度、批量自定义文件名称,自动化前端访问地址等操作
注 : 这里的说的 ”系统“ 指的是 windows 或者 macOS 操作系统,挺有趣的,而且也对比其他语言,node.js 实现的还更容易些,基本都是一个插件一句话就实现了
最近发了一些关于 node.js 的博客,没想到这么多人感兴趣,甚至还有人私信问我能不能出个文档,答案是,当然不能,不过我给大家写了几个常用功能的demo,如果谁感兴趣可以私信源码,当然我也是边学边做的,如果有大佬发现错误或者其他更简洁的实现方法,多多指教,接下来简单介绍下部分代码和功能实现,包含了以下几点 :[ WebSocket, Api, File, MySQL, Public ]
前端界面随便画了下,反正功能都能正常连上
1. 目录介绍,直接图文了哈,仅供参考奥,我自己觉着比较舒服的规格,想用就用,这里说下,这种稀奇古怪的目录图标,vscode装个插件 : Material Icon Theme
2. 工程初始化
- 新建一个文件夹,终端打开,初始化,npm init -y,大家应该都会,不多比比
- 下载 node 管理工具 :npm install express
- 下载慢的话用淘宝镜像 :npm install express --registry=https://registry.npm.taobao.org
- 根目录创建一个 app.js 文件 一般叫这个名字,实则随便,你就是叫 ikun.js 也没关系
- app.js 下随便打个 log,比如 console.log('Hello nodeJs')
- 之后输入命令 node app.js 如果终端出现打印消息 到这里基本初始化完成
- 有一点需要注意,我在之前文章也提到过,如果你的node有代码修改,必须重启才生效,还是比较麻烦的
- 所以可以下载一个热加载插件,他会监听你的修改,默认是监听所有文件,你就是加个空格或者少个空格他都会重启,不过有配置,感兴趣自己找找配置,命令 : npm install -g nodemon
- 热加载启动的话,那就是 nodemon app.js 了
- 还要下载个插件,解决资源共享问题,不然客户端访问不了 npm install cors
2. 测试是否启动成功,app.js 文件下,稍微配置下,启动之后在浏览器输入你的ip地址,这里监听的是3000,只要能进去就算成功,这里直接说下public,在代码里面已经写了,导入的地址就是目录地址,暴漏之后,直接ip地址 + 3000 + 文件名字就可以直接访问静态资源,这里就不多说了
const express = require("express") // 引入 express 框架
const app = express() // 初始化 express 模块组件
const bodyParser = require('body-parser') // 请求体加载
const cors = require('cors') // cors 中间件 解决同源策略 使资源可以共享
const public = express.static('public') // 资源暴漏
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
app.use(cors())
app.use(public)
app.listen(3000, () => {
console.log('node Start succeed')
})
3. 我这里还封装了俩方法,第一个是启动时随机获得几个表情拼接到启动成功的消息上,不然启动多了看起来比较混乱,第二个是获取本地 IP 地址的,因为我老是跑来跑去的,IP地址容易变,老规矩,想用就用,我这里只展示代码了,咋用的话看自己,或者去源码参考
// 获取 本地使用的端口号
let os = require('os')
function port(){
let interfaces = os.networkInterfaces()
for ( let interfaceName in interfaces ) {
let interfaceInfo = interfaces[interfaceName]
for (const info of interfaceInfo) {
if (info.family === 'IPv4' && !info.internal) {
return info.address
}
}
}
return 'Unable to retrieve local IP address'
}
module.exports = port
// 随机表情
let arr = ['🦴','💀','👻','👾','💗','❤️🔥','🩵','💝','💖','🍕','🍔','🍟','🌭','🍿','🥓','🥪','🍚','🕶️','👓','🧣','⚽','🏀','🎲','🧸','🪩','🃏','🪐','🌎','⛅','⛈️','🌦️','🌧️','☁️','🌜','🌞','⭐','🌠','🌈','🌠','☃️','💨']
function emoji(num){
let resStr = ''
for (let i = 0; i < num; i++) {
let index = Math.floor(Math.random() * arr.length)
resStr += ` ${arr[index]} `
}
return resStr
}
module.exports = emoji
4 . WebSocket 直接上代码了 , 使用还是比较简单的,这里示例就是收到消息之后,在控制台打印一个,之后回复,前端代码源码里也有,这里不多说前端代码了,注意下载插件,npm install ws,不过需要在主文件中将serve传给 ws 处理的哈
// WebSocket
let WebSocket = require('ws')
// 创建 WebSocket 服务器 到当前服务
let wss = null
// 所有连接的用户
let userAll = new Set()
// 暴漏 方法
function initSocket(server) {
// 赋值 传来的服务地址
wss = new WebSocket.Server({ server })
// 处理 WebSocket
wss.on('connection', (ws) => {
// 将所有连接的客户端加入到集合中
userAll.add(ws)
// 监听 WebSocket 关闭
ws.on('close',() => {})
// 监听收到的消息
ws.on('message', (message) => {
// 转为 js 对象
let msg = JSON.parse(message.toString())
// 收到的消息
console.log(msg)
// 回复消息
userAll.forEach((userItem) => {
userItem.send(JSON.stringify('yep') )
})
})
})
}
module.exports = initSocket
const express = require("express") // 引入 express 框架
const app = express() // 初始化 express 模块组件
const bodyParser = require('body-parser') // 请求体加载
const cors = require('cors') // cors 中间件 解决同源策略 使资源可以共享
const public = express.static('public') // 资源暴漏
const port = require('./utils/port') // 获取 本机 IP 地址
const emoji = require('./utils/emoji') // 获取 随机表情
const initSocket = require('./utils/socket') // WebSocket 文件
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
app.use(cors())
app.use(public)
const server = app.listen(3000, () => {
console.log('node Start succeed' + emoji(3))
initSocket(server)
})
5 . Api 接口
6 . 连接数据库
7 . 文件操作,例如在桌面创建一个文件夹
// 文件系统
let fs = require('fs')
// 创建文件夹
let newFile = () => {
return new Promise((resolve, reject) => {
let fileUrl = `C:/Users/Administrator/Desktop/nodeFile`
fs.mkdir(fileUrl, (err) => {
if (err) {
reject('文件夹创建失败')
return
}
resolve('成功')
})
})
}
module.exports = { newFile }
8 . 上传文件,需传入一个 formData 对象进来,也是需要下载插件的奥
// 使 node 可以接受外部资源
const formidable = require('formidable')
// 上传函数
function upload(req){
return new Promise((resolve, reject) => {
// 创建 formidable 实例
let form = new formidable.IncomingForm({
// 图片上传目录
uploadDir: 'public',
// 保留图片扩展名
keepExtensions: true,
// 限制图片大小为 5 MB
maxFileSize: 5 * 1024 * 1024
})
// 添加
form.parse(req, (err, fields, files) => {
// 失败
if (err) {
reject('上传失败')
return
}
// 获取服务地址
let host = req.get('host')
let protocol = req.protocol
let serverAddress = `${protocol}://${host}`
let url = serverAddress + '/' + files.file[0].newFilename
// 返回结果
resolve(url)
})
})
}
// 导出
module.exports = upload