国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

node.js實現復制文本到剪切板的功能

2024-05-06 16:34:43
字體:
來源:轉載
供稿:網友

前言

最近在工作中遇到一種需求:我需要請求后端數據,但請求數據前需要登陸,獲得一個token。登陸方式是向一個json地址post數據即可。之前我的做法是,用chrome插件postman來實現登陸動作。但后來無意中發現,postman內存占用超高!即使我并沒有使用它。這讓我很不爽。

后來一想,實現這么簡單的一個動作,用這么重的插件,對于我這樣一個會nodejs的前端程序員是不是太Low了?簡直不好意思對人講自己會nodejs!

于是我就花了點時間寫了個簡單的腳本。本文記錄一下開發過程。

實現思路

思路大概是,用nodejs腳本發請求,并將返回結果中的token自動復制到剪切板,于是我只用在調試代碼中,ctrl+v就行了。

思路很簡單,但實現起來居然坑很多。

nodejs沒有直接復制到剪切板的API!

非常簡單的功能,但nodejs沒有提供。但不要絕望,因為nodejs可以調用系統命令,而系統命令中有不少可以操作剪切板的命令。

我google之后,由于系統是windows,所以考慮使用windows cmd命令中的clip,來實現復制到剪切板的功能。

nodejs調用系統命令(cmd)

var exec = require(‘child_process').exec,然后你就可以像普通函數一樣調用它,如:exec(‘echo 111');

clip命令的坑

在cmd里,實現復制文本到剪切板最簡單的命令是:echo 123456 | clip。本來,在nodejs中拼出這樣一句語句,交給child_process.exec執行就可以了。但這個命令的執行結果,有個我無法忍受的bug:復制出來的文本,最后有個換行符(echo造成的)!我不可能在ctrl+v后,還要按幾下刪除鍵才能ctrl+s啊!

當時讓我很糾結,我很奇怪微軟連這么簡單的命令都沒作好。但無奈事情還是要做的,只有繼續尋找解決辦法。于是有了下面這個不經過echo的方式:

<nul (set/p z=123456) | clip

這種方法十分別扭,注意最開頭那個<,不是我打錯了字!大致思路是,通過set命令設置一個變量名為p(此名隨意改)的變量,值為12346,并馬上調用clip復制此變量的值。 但這種方法復制出來的值還是有bug:末尾多了一個空格!雖然你代碼里并沒有空格,但復制出來就是有!去不掉! 當時我簡直要罵娘了!沒有換行就有空格,能不能靠點譜!

麻煩而穩妥的最終實現

最后我嘗試了一種思路:得到要復制的文本后,生成一個臨時文件,將文本放進去;生成一個批處理文件,在批處理文件中調用clip命令,復制那個文本文件的內容;最后刪除臨時文本文件與批處理文件。

當時我想的是,要是這種方式還不能完美,我就棄nodejs投python!

所幸復制出來的文本,終于正常了,沒有換行符,沒有空格。

代碼如下,為了方便發請求使用了request包:

'use strict';var request = require('request');var fs = require('fs');var exec = require('child_process').exec;var execFile = require('child_process').execFile;request({ method: 'POST', uri:'http://web.test1.com/mgw/login.json', headers: {  'Content-Type':'application/json' }, body: JSON.stringify({  "loginname":"lixing1@0101005",  "pw":"aebc3ebee2f0c8b08b43d26c2b0055b19caeaf4a",  "res":"web" }) }, function (err, result, body) { console.log(body); body = JSON.parse(body); copyToClipboard(body.token, function (text, stdout) {  console.log('token copy successed!', text, stdout); })});// 簡單的復制文本到剪切板的函數,參數依次是文本,成功回調var copyToClipboard = function(text, func) { // 這種復制出來后最后有個換行符,不合要求 'echo ' + text + ' | clip'; // 這種復制出來最后有個空格,還將就 '<nul (set/p z=' + text + ') | clip'; // 這種方式最完美,但最麻煩 // 會生成一個批處理文件,一個文本文件,以批處理文件復制文件文件的內容,后又需要刪除兩個文件。 var temp = 'txt_' + Date.now() + '.txt'; var str = `@echo off<nul (set/p z=${text}) > ${temp} clip < ${temp} del ${temp}`;// 這句加入批處理,會導致報錯,雖然能執行(復制)成功。原因應該是,del批處理文件自身的時候,nodejs還在使用他// 'del "%~f0"'; var cmdFile = 'ttzkxlcjv.cmd'; fs.writeFile(cmdFile, str); exec(cmdFile, function(err, stdout, stderr) { if (err || stderr) return console.log(err, stdout, stderr); // 用nodejs刪除文件 fs.unlink(cmdFile); func(text, stdout); });};

這里面涉及到cmd clip的另一個用法,即 clip < a_text.txt,這樣會將后面這個文件的內容,復制出來。 這里面還有個小坑。即在批處理文件中,加入del "%~f0"刪除自身,本來是可以用的,但在nodejs里執行卻會報錯,后來我猜想,應該是因為批處理文件在執行到刪除自身的命令時,進程還被nodejs引用著,結果報錯了。后來只有調用nodejs的fs.unlink命令,刪除那個批處理文件。

總結

通過實現這個功能,我學會了使用Request包,調用系統命令,clip的使用方法。果然實實在在的需求,才是最強的生產力。

要是linux或mac系統,實現此功能就簡單多了。

clip命令不只可以復制文本,大家可以探索下。

備: 最近嫌每次都要自己ctrl+v太麻煩,所以我使用fs.readFile與fs.writeFile,將請求回來的token直接寫入我的配置文件。以上的剪切板功能也就沒用上了,不過我覺得很適合記錄下來這次經歷。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 交口县| 保亭| 莱州市| 通河县| 习水县| 栾城县| 科技| 安图县| 英吉沙县| 石阡县| 洛隆县| 华池县| 柘荣县| 隆安县| 南丹县| 桐梓县| 武陟县| 高州市| 周口市| 盐亭县| 东乡族自治县| 白河县| 长寿区| 晋江市| 灌南县| 盐池县| 渑池县| 和田市| 房产| 镇江市| 农安县| 虎林市| 邹城市| 仙桃市| 云阳县| 太仓市| 平昌县| 林州市| 南城县| 越西县| 万山特区|