Vue electron前端開啟局域網(wǎng)接口實(shí)現(xiàn)流程詳細(xì)介紹
一、主要實(shí)現(xiàn)原理
electron
本身就集成了Nodejs
,簡(jiǎn)直是不要太舒服。直接用最基本的http模塊開接口即可,也可以用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; } } } }
三、開啟服務(wù)器
這里的closeSever()
是防止服務(wù)被重新開啟導(dǎo)致沖突報(bào)錯(cuò)。一般來說開啟服務(wù)器后,前端要做限制。
// 開啟局域網(wǎng)接口 function openServer(): Promise<string> { // 防止重復(fù)開啟 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)聽 '/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}被占用,請(qǐng)更換占用端口`) } }) }) }
四、關(guān)閉服務(wù)器
這里有個(gè)小坑,如果單純通過 server.close()
關(guān)閉服務(wù),重復(fù)開關(guān)10次后會(huì)出警告。大致意思是監(jiān)聽端口過多,解決辦法是關(guān)閉服務(wù)器時(shí)將監(jiān)聽也移除。
// 關(guān)閉server function closeServer(): void { server && server.removeAllListeners(); server && server.close(() => { console.log("服務(wù)接口關(guān)閉"); }); }
五、簡(jiǎn)單演示
局域網(wǎng)內(nèi)設(shè)備都可以訪問接口,已測(cè)試手機(jī)APP訪問接口成功,要注意跨域問題。
六、整體代碼
server.ts
const os = require('os'); const http = require('http') let server: any // 開啟局域網(wǎng)接口 function openServer(): Promise<string> { // 防止重復(fù)開啟 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)聽 '/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}被占用,請(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 }
七、展望
如果想把接口開放到外網(wǎng),我目前只知道用路由器本機(jī)地址內(nèi)網(wǎng)穿透。不過挺麻煩,小軟件不需要這么多需求。還有,我想問下uniapp
能否像這個(gè)一樣在前端開啟接口?
到此這篇關(guān)于Vue electron前端開啟局域網(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-03Vue el-table表頭上引入組件不能實(shí)時(shí)傳參解決方法分析
這篇文章主要介紹了Vue el-table表頭上引入組件不能實(shí)時(shí)傳參解決方法,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路2022-11-11關(guān)于json-bigint處理大數(shù)字問題
這篇文章主要介紹了關(guān)于json-bigint處理大數(shù)字問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Vue3使用Proxy實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽的原因分析
在本篇文章里小編給大家整理的是一篇關(guān)于Vue3使用Proxy實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽的原因分析內(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