在現代web開發中,使用Node.js來建立後端應用程式已經成為了一種趨勢。而隨著應用程式不斷的更新,我們常常需要在伺服器上部署新的更新版本。因此,本文將介紹如何使用Node.js部署上傳壓縮包,實現快速、簡單、有效率的應用程式更新。
在上傳前,我們需要將需要部署的檔案壓縮成一個Zip或tar.gz檔案。使用Node.js來完成檔案壓縮非常簡單,只需要使用Node.js內建的「zlib」和「fs」模組就可以輕鬆實現檔案壓縮。以下是簡單的壓縮程式碼:
const fs = require('fs'); const zlib = require('zlib'); const srcFileName = 'srcFile.txt'; const destFileName = 'srcFile.txt.gz'; // 创建压缩流 const gzip = zlib.createGzip(); const inp = fs.createReadStream(srcFileName); const out = fs.createWriteStream(destFileName); inp.pipe(gzip).pipe(out); console.log('文件压缩成功!');
我們可以將上面的程式碼封裝成一個函數,方便以後使用:
const fs = require('fs'); const zlib = require('zlib'); function compress(file) { const gzip = zlib.createGzip(); const src = fs.createReadStream(file); const dest = fs.createWriteStream(file + '.gz'); src.pipe(gzip).pipe(dest); console.log(`文件 ${file} 压缩成功!`); }
其中的「file」是需要壓縮的檔案名,可以是相對路徑或絕對路徑。
完成檔案壓縮後,我們需要將壓縮後的檔案上傳到伺服器。這裡我們可以使用第三方的模組來實現檔案上傳功能。一個常用的模組是“formidable”,這是一個高效率的表單解析模組,可以幫助我們處理文件上傳操作。
首先,我們需要安裝「formidable」:
npm install formidable --save
然後,我們可以使用以下程式碼來實作檔案上傳功能:
const http = require('http'); const formidable = require('formidable'); const fs = require('fs'); http.createServer((req, res) => { if (req.url === '/upload' && req.method.toLowerCase() === 'post') { const form = formidable({ multiples: true }); form.parse(req, (err, fields, files) => { const oldPath = files.file.path; const newPath = __dirname + '/uploads/' + files.file.name; fs.rename(oldPath, newPath, (err) => { if (err) throw err; res.writeHead(200, { 'content-type': 'text/plain' }); res.end('文件上传成功!'); }); }); return; } }).listen(8080); console.log('服务器启动成功!');
如上面程式碼所示,我們創建一個HTTP伺服器,監聽埠為8080。當客戶端請求URL為「/upload」的POST請求時,我們使用「formidable」解析POST請求中的檔案資料。在解析之後,我們可以獲取到上傳文件的相關信息,包括文件名稱、文件大小、文件類型等。然後,我們將檔案從臨時路徑移動到上傳目錄。
要注意的是,在使用「formidable」解析時,需要設定「multiples」為true,以支援上傳多個檔案。我們也可以透過設定其他參數來控制上傳檔案的大小、儲存路徑等。
當伺服器收到壓縮檔案後,我們需要對檔案進行解壓縮,才能開始更新操作。使用Node.js解壓縮檔案同樣非常簡單,只需要使用Node.js內建的「zlib」和「fs」模組即可。以下是一個簡單的解壓縮程式碼實作:
const fs = require('fs'); const zlib = require('zlib'); const srcFileName = 'srcFile.txt.gz'; const destFileName = 'srcFile.txt'; // 创建解压流 const gunzip = zlib.createGunzip(); const inp = fs.createReadStream(srcFileName); const out = fs.createWriteStream(destFileName); inp.pipe(gunzip).pipe(out); console.log('文件解压成功!');
和壓縮函數一樣,我們也可以將上面的程式碼封裝成一個函數,方便以後使用:
const fs = require('fs'); const zlib = require('zlib'); function uncompress(file) { const gunzip = zlib.createGunzip(); const src = fs.createReadStream(file); const dest = fs.createWriteStream(file.replace('.gz', '')); src.pipe(gunzip).pipe(dest); console.log(`文件 ${file} 解压成功!`); }
其中的「file」是需要解壓縮的壓縮檔名,可以是相對路徑或絕對路徑。
完成解壓縮後,我們可以將文件再移動到應用程式運行的目錄中,覆蓋原有的應用程式文件,一次部署更新工作就完成了。以下是簡單的程式碼實作:
const fs = require('fs'); const path = require('path'); const appDir = 'app'; function deploy(file) { const fileName = path.basename(file); const destPath = path.join(appDir, fileName); fs.copyFile(file, destPath, (err) => { if (err) throw err; console.log(`文件 ${fileName} 部署成功!`); }); }
其中的「file」是需要部署的解壓縮後的檔案名,可以是相對路徑或絕對路徑。 appDir
是我們應用程式運行的目錄。
最後,我們將上述功能完整的程式碼整合起來:
const http = require('http'); const formidable = require('formidable'); const fs = require('fs'); const path = require('path'); const zlib = require('zlib'); const appDir = 'app'; http.createServer((req, res) => { if (req.url === '/upload' && req.method.toLowerCase() === 'post') { const form = formidable({ multiples: true }); form.parse(req, (err, fields, files) => { const oldPath = files.file.path; const newPath = __dirname + '/' + files.file.name; fs.rename(oldPath, newPath, (err) => { if (err) throw err; console.log('文件上传成功!'); uncompress(newPath); }); }); return; } res.writeHead(200, { 'Content-Type': 'text/html' }); res.end(` <form action="/upload" method="POST" enctype="multipart/form-data"> <input type="file" name="file" multiple> <button type="submit">上传</button> </form> `); }).listen(8080); console.log('服务器启动成功!'); function compress(file) { const gzip = zlib.createGzip(); const src = fs.createReadStream(file); const dest = fs.createWriteStream(file + '.gz'); src.pipe(gzip).pipe(dest); console.log(`文件 ${file} 压缩成功!`); } function uncompress(file) { const gunzip = zlib.createGunzip(); const src = fs.createReadStream(file); const dest = fs.createWriteStream(file.replace('.gz', '')); src.pipe(gunzip).pipe(dest); console.log(`文件 ${file} 解压成功!`); deploy(file.replace('.gz', '')); } function deploy(file) { const fileName = path.basename(file); const dest = path.join(appDir, fileName); fs.copyFile(file, dest, (err) => { if (err) throw err; console.log(`文件 ${fileName} 部署成功!`); }); }
以上程式碼實作了一個簡單的檔案上傳、壓縮、解壓縮、部署的功能,可以依照自己的需求來進行客製化。
以上是nodejs部署上傳壓縮封包的詳細內容。更多資訊請關注PHP中文網其他相關文章!