概要
主要通過(guò)實(shí)驗(yàn)性模塊inspector實(shí)現(xiàn)手動(dòng)開(kāi)啟關(guān)閉瞬逊,修改調(diào)試接口以實(shí)現(xiàn)遠(yuǎn)程調(diào)試
說(shuō)明
我們知道通過(guò)啟動(dòng)命令可以設(shè)置調(diào)試開(kāi)啟和關(guān)閉
node --inspect=191.168.1.15:9229 app.js
但是通常我們不會(huì)專門(mén)準(zhǔn)備好一個(gè)調(diào)試接口針對(duì)每個(gè)進(jìn)程,但是一旦遇到很難復(fù)現(xiàn)的問(wèn)題就很抓瞎了。好在實(shí)現(xiàn)性模塊inspector開(kāi)通了設(shè)置調(diào)試接口的一些信息秤茅。
我們可以通過(guò)類似下面腳本實(shí)現(xiàn)手動(dòng)動(dòng)態(tài)配置
const SECRET = '45u90rjigjrihfngihghkbgh+jghg/af';
// 手動(dòng)開(kāi)啟調(diào)試接口-通過(guò)http協(xié)議開(kāi)啟
function inspector(req, resp, queryInfoDic) {
if (resp.finished) {
return;
}
// 參數(shù)校驗(yàn)權(quán)限
if (!queryInfoDic.params.secret || queryInfoDic.params.secret.replace(/ /g, '+') !== SECRET) {
resp.end('1');
return;
}
const inspector = require('inspector');
// 端口宙彪,地址摸屠,是否只是關(guān)閉
let {port, host, close} = queryInfoDic.params;
inspector.close();
// 只關(guān)閉
if (close) {
return resp.end(inspector.url());
}
// 分配端口
if (port) {
port = Number.parseInt(port);
}
if (!Number.isSafeInteger(port)) {
port = 9229;
}
let args = [port];
// 地址
if (host) { // 一般是目標(biāo)服務(wù)器的本地IP
args.push(host);
}
inspector.open(...args);
resp.end(inspector.url());
}
只需把此請(qǐng)求掛在http/ws服務(wù)器route上即可诸典。
補(bǔ)充
云服務(wù)器一般調(diào)試的安全性起見(jiàn)我們都會(huì)選擇host是內(nèi)網(wǎng)IP,這就遭遇到遠(yuǎn)程調(diào)試不便的問(wèn)題今膊。
策略1 花錢(qián)
申請(qǐng)一臺(tái)云服務(wù)器系統(tǒng)是windows系統(tǒng)些阅,內(nèi)網(wǎng)互通直接解決一切問(wèn)題。
策略2 費(fèi)事
做nginx代理轉(zhuǎn)發(fā)對(duì)一個(gè)外網(wǎng)IP(23.434.355.34)的某個(gè)端口8800,做ws轉(zhuǎn)ws到調(diào)試服務(wù)器內(nèi)網(wǎng)IP+調(diào)試端口斑唬。
這樣只是會(huì)每次都需要運(yùn)維小弟弟給你臨時(shí)開(kāi)放端口市埋。