Truy xuất Object Instance bất kỳ đâu



  • Hi mọi người,
    Mình dùng Expressjs và mongodb cho một ứng dụng web nhỏ.
    Cho mình hỏi có cách nào tạo một object, ví dụ model instance, và truy xuất cái object đó bất kỳ đâu trong ứng dụng không?

    Vì hiện tại mình phải pass argument, nó không rắc rối gì nhưng nhiều trường hợp pass vào rồi lại không dùng.

    Mình có xem qua global variable, nhưng web của mình là đa người dùng, nên global variable không dùng được.

    Xin mọi người chỉ giáo.



  • @Dang-Nguyen-Hai Hiện tại cũng cũng đang dùng global. vẫn xài bt mà


  • Global Moderator

    @Dang-Nguyen-Hai Bạn tham khảo thư viện Kiper do mình viết nhé. Với yêu cầu của bạn thì thư viện này đáp ứng được

    Trước đây đã giới thiệu trên diễn đàn:

    https://nodejs.vn/topic/1000/kiper-thư-viện-theo-dõi-và-lưu-trữ-các-objects-trong-ứng-dụng-nodejs

    Bạn có thể xem live demo ở đây nhé: https://runkit.com/vunb/runkit-npm-kiper



  • @Vũ Cám ơn bạn
    Nhưng có một điều là trang web của mình nhiều người dùng, mỗi lần request được gởi lên server thì mình keep user instance vào:
    kiper.keep('user', req.user)

    Và trong model mình gọi nó ra:
    kiper.get('user')

    Nhưng khi có nhiều request thuộc nhiều user được gửi lên gần như cùng lúc: User A gửi request 1 trước và User B gửi request 2 sau, kiper sẽ giữ userA Object, khi User A chưa xong thì User B gửi một request lên và kiper lúc này lại giữ userB Object. Lúc này User A lấy thông tin trong kiper ra là của User B.

    Và dẫn đến việc user A truy xuất vào tài nguyên của user B.


  • Global Moderator

    @Dang-Nguyen-Hai Bạn tùy biến cách lưu trữ nào là được. Như bạn đang làm là key user sẽ được ghi lại bởi Users khác. Bạn nên chú ý điểm này để có cách lưu trữ đúng hợp lý.

    Với dữ liệu cá nhân của từng users như thế bạn có thể lưu mỗi users một cấu hình, ví dụ:

    kiper.keep(req.user.username, req.user)

    Hoặc:

    kiper.keep('user', {[req.user.username]: req.user})

    Bạn tham khảo nhé!



  • @Vũ Lưu như vậy đến lúc nào đó sẽ bị leak memory bạn. Vì thông tin của tất cả user vẫn còn lưu trong bộ nhớ. Cái kiper nó đâu có tự hủy hay clear data khi kết thúc request đâu.

    Hơn nữa, lúc get ra mình không có username hay bất kỳ thông tin nào của user, nên mình không lưu như vậy được.

    P/s: cái này có khác gì đâu:

    @Vũ said in Truy xuất Object Instance bất kỳ đâu:

    kiper.keep('user', {[req.user.username]: req.user})


  • Global Moderator

    @Dang-Nguyen-Hai Mấu chốt của vấn đề là bạn đang không có thông tin username =)) Mình nghĩ bạn cần có 1 cơ chế khác để trao đổi thông tin.

    Hơn nữa, lúc get ra mình không có username hay bất kỳ thông tin nào của user, nên mình không lưu như vậy được.

    Một khả năng nữa của kiper là truyền sự kiện, bạn có thể làm như này mà không cần add key vào kiper, ví dụ bạn có thể làm như này:

    // 1. tại hàm xử lý model, setup lắng nghe sự kiện
    kiper.on('user', (user) => {
         // xử lý user
         // ...
    })
    
    // 2. tại controller, phát sự kiện
    kiper.emit('user', req.user);
    

    @Vũ Lưu như vậy đến lúc nào đó sẽ bị leak memory bạn. Vì thông tin của tất cả user vẫn còn lưu trong bộ nhớ. Cái kiper nó đâu có tự hủy hay clear data khi kết thúc request đâu.

    Kiper có khả năng tự hủy sau bao nhiêu miliseconds mà bạn thiết lập cho nó ở tham số thứ 3 nhé!

    kiper.keep('key', 'objectValue', 3000, (value, key) => {
        console.log('key và objectValue bị xóa sau 3 giây.', key, value)
    })
    

    Trên là gợi ý của mình. Bạn test thử xem nhé!



  • @Vũ Mình không để tự hủy theo thời gian được, một tác vụ lâu mà nó hủy cái thì lấy gì xài. Mà nó cũng không giải quyết được vấn đề nhiều request thuộc nhiều người dùng.

    Kiper có khả năng tự hủy sau bao nhiêu miliseconds mà bạn thiết lập cho nó ở tham số thứ 3 nhé!

    Cái mình cần cũng là lấy ra cái username ạ.

    Mấu chốt của vấn đề là bạn đang không có thông tin username

    Mình cũng nghĩ vậy nên mới phải đi hỏi.

    Mình nghĩ bạn cần có 1 cơ chế khác để trao đổi thông tin.



  • Vấn đề này mình cũng gặp phải khi làm chatbot, cụ thể hai Obj req thỉnh thoản được dùng ở chổ này hoặc chổ khác, thất bất tiện khi phải truyền nó như một function.

    Nhờ kinh nghiệm làm qua một số ngôn ngữ hướng OOP và một số framework MVC, mình nghĩ ra một cách là OOP nó.

    1. Đầu tiên, buil một class, tạm gọi là Base. Trong class này định nghĩ sẵn một số function, obj chung nhất.
    2. Kế thừa dần lên theo free.

    Như vậy, VD object req của mình được định nghĩa ngay từ class Base đó, các class sau cứ kế thừa nó là có object này để dùng. Khỏi mắc công truyền tới truyền lui. Cách này được dùng khá nhiều ở các framework PHP, nếu bác có làm qua thì đọc code phần core của nó sẽ thấy.


Log in to reply