Vue electron前端開(kāi)啟局域網(wǎng)接口實(shí)現(xiàn)流程詳細(xì)介紹
一、主要實(shí)現(xiàn)原理
electron本身就集成了Nodejs,簡(jiǎn)直是不要太舒服。直接用最基本的http模塊開(kāi)接口即可,也可以用express,看個(gè)人喜好。下面演示的是http模塊。
二、獲取本機(jī)局域網(wǎng)IP
首先要獲取本機(jī)局域網(wǎng)的IP,這就是接口的IP地址了。
// 獲取本機(jī)的局域網(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;
}
}
}
}
三、開(kāi)啟服務(wù)器
這里的closeSever()是防止服務(wù)被重新開(kāi)啟導(dǎo)致沖突報(bào)錯(cuò)。一般來(lái)說(shuō)開(kāi)啟服務(wù)器后,前端要做限制。
// 開(kāi)啟局域網(wǎng)接口
function openServer(): Promise<string> {
// 防止重復(fù)開(kāi)啟
closeServer()
// 獲取本機(jī)的局域網(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)聽(tīng) '/api/authentication'
if (req.method === 'POST' && req.url === '/api/authentication') {
let context = {
code: 200,
data: { type: 'Hello World!' }
}
res.end(JSON.stringify(context))
}
})
// 返回端口開(kāi)啟結(jié)果
return new Promise<string>((resolve, reject) => {
server.listen(SERVER_PORT, SERVER_IP, () => {
// 服務(wù)器正確開(kāi)啟
resolve(`服務(wù)器開(kāi)啟成功,服務(wù)器地址: http://${SERVER_IP}:${SERVER_PORT}`)
})
server.on('error', (err: any) => {
if (err.code === 'EADDRINUSE') {
// 服務(wù)器端口已經(jīng)被使用
reject(`端口:${SERVER_PORT}被占用,請(qǐng)更換占用端口`)
}
})
})
}
四、關(guān)閉服務(wù)器
這里有個(gè)小坑,如果單純通過(guò) server.close() 關(guān)閉服務(wù),重復(fù)開(kāi)關(guān)10次后會(huì)出警告。大致意思是監(jiān)聽(tīng)端口過(guò)多,解決辦法是關(guān)閉服務(wù)器時(shí)將監(jiān)聽(tīng)也移除。

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

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

