Vue electron前端開啟局域網(wǎng)接口實現(xiàn)流程詳細(xì)介紹
一、主要實現(xiàn)原理
electron本身就集成了Nodejs,簡直是不要太舒服。直接用最基本的http模塊開接口即可,也可以用express,看個人喜好。下面演示的是http模塊。
二、獲取本機局域網(wǎng)IP
首先要獲取本機局域網(wǎng)的IP,這就是接口的IP地址了。
// 獲取本機的局域網(wǎng)IP
function getServerIp() {
let interfaces = os.networkInterfaces();
for (let devName in interfaces) {
let iface = interfaces[devName];
for (let i = 0; i < iface.length; i++) {
let alias = iface[i];
if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
return alias.address;
}
}
}
}
三、開啟服務(wù)器
這里的closeSever()是防止服務(wù)被重新開啟導(dǎo)致沖突報錯。一般來說開啟服務(wù)器后,前端要做限制。
// 開啟局域網(wǎng)接口
function openServer(): Promise<string> {
// 防止重復(fù)開啟
closeServer()
// 獲取本機的局域網(wǎng)IP和自定義端口
let SERVER_PORT = 65526
let SERVER_IP = getServerIp()
server = http.createServer()
server.on('request', (req: any, res: any) => {
// 防止跨域
res.writeHead(200, { "Content-Type": "application/json;charset=utf-8", "access-control-allow-origin": "*" })
// 監(jiān)聽 '/api/authentication'
if (req.method === 'POST' && req.url === '/api/authentication') {
let context = {
code: 200,
data: { type: 'Hello World!' }
}
res.end(JSON.stringify(context))
}
})
// 返回端口開啟結(jié)果
return new Promise<string>((resolve, reject) => {
server.listen(SERVER_PORT, SERVER_IP, () => {
// 服務(wù)器正確開啟
resolve(`服務(wù)器開啟成功,服務(wù)器地址: http://${SERVER_IP}:${SERVER_PORT}`)
})
server.on('error', (err: any) => {
if (err.code === 'EADDRINUSE') {
// 服務(wù)器端口已經(jīng)被使用
reject(`端口:${SERVER_PORT}被占用,請更換占用端口`)
}
})
})
}
四、關(guān)閉服務(wù)器
這里有個小坑,如果單純通過 server.close() 關(guān)閉服務(wù),重復(fù)開關(guān)10次后會出警告。大致意思是監(jiān)聽端口過多,解決辦法是關(guān)閉服務(wù)器時將監(jiān)聽也移除。

// 關(guān)閉server
function closeServer(): void {
server && server.removeAllListeners();
server && server.close(() => {
console.log("服務(wù)接口關(guān)閉");
});
}
五、簡單演示
局域網(wǎng)內(nèi)設(shè)備都可以訪問接口,已測試手機APP訪問接口成功,要注意跨域問題。

六、整體代碼
server.ts
const os = require('os');
const http = require('http')
let server: any
// 開啟局域網(wǎng)接口
function openServer(): Promise<string> {
// 防止重復(fù)開啟
closeServer()
// 獲取本機的局域網(wǎng)IP和自定義端口
let SERVER_PORT = 65526
let SERVER_IP = getServerIp()
server = http.createServer()
server.on('request', (req: any, res: any) => {
// 防止跨域
res.writeHead(200, { "Content-Type": "application/json;charset=utf-8", "access-control-allow-origin": "*" })
// 監(jiān)聽 '/api/authentication'
if (req.method === 'POST' && req.url === '/api/authentication') {
let context = {
code: 200,
data: { type: 'Hello World!' }
}
res.end(JSON.stringify(context))
}
})
// 返回端口開啟結(jié)果
return new Promise<string>((resolve, reject) => {
server.listen(SERVER_PORT, SERVER_IP, () => {
// 服務(wù)器正確開啟
resolve(`服務(wù)器開啟成功,服務(wù)器地址: http://${SERVER_IP}:${SERVER_PORT}`)
})
server.on('error', (err: any) => {
if (err.code === 'EADDRINUSE') {
// 服務(wù)器端口已經(jīng)被使用
reject(`端口:${SERVER_PORT}被占用,請更換占用端口`)
}
})
})
}
// 關(guān)閉server
function closeServer(): void {
server && server.removeAllListeners();
server && server.close(() => {
console.log("服務(wù)接口關(guān)閉");
});
}
// 獲取本機的局域網(wǎng)IP
function getServerIp() {
let interfaces = os.networkInterfaces();
for (let devName in interfaces) {
let iface = interfaces[devName];
for (let i = 0; i < iface.length; i++) {
let alias = iface[i];
if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
return alias.address;
}
}
}
}
export {
openServer,
closeServer
}七、展望
如果想把接口開放到外網(wǎng),我目前只知道用路由器本機地址內(nèi)網(wǎng)穿透。不過挺麻煩,小軟件不需要這么多需求。還有,我想問下uniapp能否像這個一樣在前端開啟接口?
到此這篇關(guān)于Vue electron前端開啟局域網(wǎng)接口實現(xiàn)流程詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Vue electron內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue預(yù)覽本地pdf文件方法之vue-pdf組件使用
這篇文章主要介紹了vue預(yù)覽本地pdf文件方法之vue-pdf組件使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
Vue el-table表頭上引入組件不能實時傳參解決方法分析
這篇文章主要介紹了Vue el-table表頭上引入組件不能實時傳參解決方法,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路2022-11-11
關(guān)于json-bigint處理大數(shù)字問題
這篇文章主要介紹了關(guān)于json-bigint處理大數(shù)字問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Vue3使用Proxy實現(xiàn)數(shù)據(jù)監(jiān)聽的原因分析
在本篇文章里小編給大家整理的是一篇關(guān)于Vue3使用Proxy實現(xiàn)數(shù)據(jù)監(jiān)聽的原因分析內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-11-11
使用Plotly.js在Vue中創(chuàng)建交互式散點圖的示例代碼
Plotly.js是一個功能強大的JavaScript庫,用于創(chuàng)建交互式數(shù)據(jù)可視化,它支持各種圖表類型,包括散點圖、折線圖和直方圖,在Vue.js應(yīng)用程序中,Plotly.js可用于創(chuàng)建動態(tài)且引人入勝的數(shù)據(jù)可視化,本文介紹了使用Plotly.js在Vue中創(chuàng)建交互式散點圖,需要的朋友可以參考下2024-07-07

