Skip to content

Category: Software Development

Stub JavaScript ES6 Class method ด้วย Sinon

ใครที่เขียน Unit test สำหรับ JavaScript, Node.js น่าจะรู้จัก Sinon เป็นอย่างดี เพราะเป็นไลบรารี่สำหรับสร้าง mock, stub จำลองการทำงานของ service ภายนอกที่นิยมมากตัวหนึ่ง

เดิมที JavaScript นั้นไม่มีแนวคิดเรื่อง class เป็นแค่ function หนึ่งเท่านั้น แต่นับตั้งแต่ ES2015 หรือ ES6 เป็นต้นมานั้นมี class ให้ใช้แล้ว (ถึงจะแบบถูๆ ไถๆ ก็เถอะ) แต่ปัญหาที่พบคือ Sinon รุ่นเก่าๆ มันใช้กับ class ไม่ได้เพราะไม่ได้อัปเดตตามมาตรฐาน ES6

แต่ตอนนี้ Sinon v2.4.1 (ณ วันที่เขียนวันนี้นะ จริงๆ ตั้งแต่รุ่น 2 เป็นต้นมาอาจจะใช้ได้แล้ว) นั้นใช้กับ class ได้แล้ว! จะว่ารองรับตรงๆ เลยก็ไม่เชิง คือมันเป็น work around ที่หน้าตา JavaScript มากๆ

Leave a Comment

Node.js | ข้อควรระวังการใช้งาน Async/Await กับ forEach()

หลายคนเข้าใจว่า function ใดๆ ที่รับ callback function เป็น parameter จะทำงานแบบ async เสมอ ซึ่งเป็นความเข้าใจที่ผิด (ผมก็เคยเข้าใจแบบนั้น) แต่บาง function ก็ทำงานแบบ synchrous นะครับ เช่น  forEach()  ที่เป็น built-in function ของ collection ใน JavaScript ก็ทำงานแบบ synchronous เช่นกัน ดู spec ที่นี่

สมมุติว่าผมต้องการ ใช้ async/await กับ forEach() ผมก็สามารถใช้งาน async กับ callback function ที่ส่งเข้าไป เพื่อให้ใช้ await ได้เช่นกัน ดูตัวอย่างโค้ดนี้ครับ

Leave a Comment

Node.js | ลองใช้งาน Async/Await กับ Node 7

Node 7 ออกแล้วนะครับ ตอนนี้รองรับ Es6 features ถึง 98% แล้ว ที่นักพัฒนาดูจะให้ความสนใจกันเป็นพิเศษคือสามารถใช้งาน async/await ซึ่งเป็น synctax  ของ Es7 ได้โดยไม่ต้องติดตั้งตัว transpile อย่าง Babel เพิ่มเติม

แต่ …. ยังไม่ได้เปิดใช้งานเป็นค่า default ถ้าอยากใช้ async/await ต้องใส่ option --harmony-async-await  ตอนรัน 

Leave a Comment

บันทึกการใช้งาน Socket.io v1 และประเด็นที่น่าสนใจ

ใครที่ใช้ Node.js ในการทำ real-time application น่าจะรู้จัก WebSocket และ Socket.io กันเป็นอย่างดี ตอนนี้ Socket.io เดินทางมาถึง version 1 แล้ว (ล่าสุดที่ผมเขียนโพสต์นี้คือ 1.5.0) ซึ่งก็มีหลายอย่างเปลี่ยนไปจากรุ่น 0.9 ค่อนข้างมาก หลายโปรเจกต์ที่ผมเคยเขียนไว้ด้วย version 0.9 ตอนนี้ก็ outdated ไปแล้วไม่สามารถใช้งาน version 1 ได้ แต่ก็มีบางงานที่ใช้ version 1 แล้ว พบประเด็นที่น่าสนใจเลยอยากบันทึกไว้สักหน่อย

Leave a Comment

ทำ Ranking/Leaderboard ด้วย Redis #2

โพสต์ที่แล้ว “ทำ Ranking/Leaderboard ด้วย Redis #1” แล้วผมทำ ranking แบบอันดับซ้ำกันและข้ามอันดับได้ คราวนี้ลองมาทำอีกแบบคืออันดับซ้ำกันและไม่มีการข้ามอันดับดูบ้าง  ranking ที่เราคาดหวังจะเป็นแบบนี้

Leave a Comment

ทำ Ranking/Leaderboard ด้วย Redis #1

โจทย์ของผมคือผมต้องการ

  1. Ranking ที่อัปเดตแบบ real-time
  2. ไม่ query จาก database โดยตรงและ query บ่อยๆ
  3. Rank หรืออันดับสามารถซ้ำได้

จากข้อ 3 อันดับซ้ำกันได้มี 2 แบบ ตัวอย่างเช่น

แบบที่ 1 non-skipped ranking

แบบที่ 2 skipped ranking

1 Comment

MongoDB | find() ด้วย Regular Expression แบบไหน ใช้/ไม่ใช้ index

จริงๆ ผมว่าจะเขียนรื่องนี้นานแล้วแต่เดือนที่ผ่านมา (กันยายน) งานยุ่งๆ ระเบียบวินัยก็ค่อนข้างแย่ ทั้งออกกำลังกายและเขียนบล็อก เดือนที่แล้วเลยไม่ได้เขียนอะไรเป็นชิ้นเป็นอัน ขอยกยอดมาเขียน (แบบอู้ๆ อีกนั่นแหละ) เดือนนี้แล้วกัน

คำสั่ง find() ของ MongoDB นั้นรองรับการ query ด้วย Regular Expression โดยสามารถเขียน syntax แบบ PCRE (Perl Compatible Regular Expression) ตัวอย่างเช่น

Leave a Comment