iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
自我挑戰組

30 天 Node.js 探索:基礎、進階與實踐系列 第 30

Day 30: 測試、優化應用、心得

  • 分享至 

  • xImage
  •  

在今天的內容中,將進行應用的測試與優化。測試是確保應用在各種情況下能夠正常運行的重要環節,而優化則能提高應用的性能和使用體驗,最後則是在這三十天的種種感想。

測試應用

使用 Mocha 和 Chai 進行單元測試和 API 測試。這兩個工具相輔相成,可以幫助驗證應用的功能是否如預期運作。
安裝 Mocha 和 Chai:

bash
npm install --save-dev mocha chai

在專案目錄中建立 test 文件夾,並在其中創建測試文件:

js
const chai = require('chai');
const chaiHttp = require('chai-http');
const server = require('../app'); // 引入你的 Express 應用

chai.should();
chai.use(chaiHttp);

describe('Transactions API', () => {
  it('應該獲取所有交易紀錄', (done) => {
    chai.request(server)
      .get('/api/transactions')
      .end((err, res) => {
        res.should.have.status(200);
        res.body.should.be.a('array');
        done();
      });
  });
});

使用 Mocha 進行測試:

npx mocha

這將會運行測試並顯示結果。如果測試通過,就代表應用的功能正確無誤。

應用優化

優化應用的性能和反應速度是一個持續的過程,今天介紹幾個方面是可以優化的方向:
資料庫查詢優化
使用 MongoDB 時,可以針對查詢的需求創建索引,提高查詢速度。針對常用的查詢條件(如用戶ID),可以為資料庫字段創建索引。

js
transactionSchema.index({ userId: 1 });

使用緩存
對於高頻繁的讀取操作(如顯示財務報表),可以利用 Redis 進行緩存,減少資料庫的負載,提升應用的反應速度。
安裝 Redis:

bash
npm install redis

設置緩存範例:

js
const redisClient = require('redis').createClient();

const getFinancialReport = async (req, res) => {
  redisClient.get(`report:${req.user.id}`, async (err, report) => {
    if (report) {
      return res.status(200).json(JSON.parse(report));
    } else {
      const transactions = await Transaction.find({ userId: req.user.id });
      const reportData = calculateReport(transactions);
      redisClient.setex(`report:${req.user.id}`, 3600, JSON.stringify(reportData));
      return res.status(200).json(reportData);
    }
  });
};

非同步 I/O 與程式優化
Node.js 是基於非同步 I/O 模型,所以應該確保在處理 I/O 操作時,使用適當的非同步方法,避免阻塞應用的主執行緒。

性能監控

利用工具如 New Relic 或 PM2 進行性能監控,能幫助檢測應用的瓶頸,及時發現並解決潛在的性能問題。
使用 PM2 來監控應用的記憶體使用和 CPU 資源,並進行負載均衡:

bash
npm install pm2 -g
pm2 start app.js --watch
pm2 monit

總結與心得

終於做完這三十天了!這段時間以來實在是非常有挑戰性,而且每天都會去接觸到,過程是蠻辛苦的,也遇到許多程式瓶頸,常常Debug了半天才解決,但透過網路上前輩們的資料,以及Chatgpt的協助,我才能一步一步走到現在,順利完成此次鐵人賽,也順利實作出個人財務管理應用,雖然功能還有很大的進步空間,但這也是我很大的一個突破,期望未來能做出更好的作品!


上一篇
Day 29: 部署至 Heroku
系列文
30 天 Node.js 探索:基礎、進階與實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言