Giúp mình về mô hình MVC trong mysql



  • Mình có tạo một controller, mình console thì ok.

    var Category  = require('../models/category');
    
    Category.findAll().then(items => {
      console.log(items)
    })
    
    Category.find().then(items => {
      console.log(items)
    })
    

    Mình tạo thêm một file router index.js:

    var modelsCategory = require('../api/controllers/categoryController');
    
    router.get('/', function(req, res, next) {
            res.render('category', {content1: result1, content2:result2});
    });
    

    Cho hỏi mình muốn lấy result1result2 từ hai hàm ở controller thì viết như thế nào.

    Tìm hiểu nhiều mà chưa thấy tài liệu, mong mọi người giúp đỡ ak.



  • @Sang-Nhoc Viết lại Controller trả về 1 Promise

    // Category Gateway
    var Category = require('../models/category');
    
    export const CategoryGateway = {
        findAll: () => {
            return Category.findAll();
        },
        fineOne: () => {
            return Category.find();
        }
    }
    
    // Category Controller
    var CategoryGateway = require('../api/controllers/categoryController');
    
    router.get('/',  function(req, res, next) {
        Promise.all([CategoryGateway.findAll(), CategoryGateway.findOne()]).then((datas) => {
            res.render('category', {content1: datas[0], content2: datas[1]});
        })
    });
    

    sủ dụng Promise All cho Multi Promise

    Sent from Rodgers Zone!!!

    1


  • Ngoài việc viết Promise còn cách nào khác không bạn.

    Giả sử mình viết kiểu này:

    exports.category_list = function(req, res) {
    Category.findAll().then(items => {
    res.send(items);
    })
    };

    Làm sao để truyền res.send vào router nhỉ:

    var category_controller = require('../api/controllers/categoryController');
    router.get('/test', function(req, res, next) {
    res.render('test', {result: category_controller.category_list});
    });

    Làm sao để truyền vào biến result, mình truyền như vậy nó không hiểu.

    Bạn giúp mình chỗ này được không



  • @Sang-Nhoc

    • Cách khác là bạn dùng callback để xử lí. Vì về cơ bản thì hàm query trên kia đều là hàm async. Thì bạn xử lí Async thì JS có mấy cách thoai. Promise là cách cũng ổn và đẹp mắt roài.

    • Res là 1 object của NodeJS built. Thì nó có sp send liên tục và khi nào sẽ ngắt kết nối. Bạn có thể coi nó là any object. Nếu bạn muốn sử dụng Res như tren thì mô hình rất fail. Vì lúc đó bạn không qunar lý được việc send dữ liệu lúc nào và dễ có bug. Tuy nhiên bạn vẫn có thể dùng bằng cách viết 1 function bọc lại câu query. Và truyền res = input vào. Hoặc cũng có thể dùng this. (apply, call, bind của Function JavaScript)

    Sent from Rodgers Zone!!!

    0


  • Cám ơn bạn:

    Bạn cho mình hỏi chỗ này: mình đang muốn phân trang:

    ListAll: () => {
            return Models.findAll({ 
                offset: 0,
                limit: 10
            });
        }
    

    Làm sao mình truyền biến vào offset và limit nhỉ.

    Bạn có tài liệu nào phân trang sequelizejs, mình lên doc của nó không tìm thấy.

    Tks



  • @Sang-Nhoc

    ListAll: (offset, limit) => {
            return Models.findAll({ 
                offset: offset,
                limit: limit
            });
        }
    

    () => { } là function trong ES6 đó.

    Sent from Rodgers Zone!!!

    0


  • Cảm ơn bạn.
    Mình đang tìm hiểu sequelizejs mà mình đoc tài liệu không thấy cache mysql.

    Mình đang cần cache để nghiên cứu, bạn có thể giúp mình về cache mysql trong nodejs .

    Tks



  • @Sang-Nhoc
    Về cache thì có 2 cái đúng không. 1 là cache ở tầng MySQL. Thì bạn tự viết query theo pratices của MySQL rồi gọi xuống sẽ được hỗ trợ. 2 là bạn dùng 1 service khác cache các kiểu query lại. Thì có module sequelize-redis-cache cũng khá nhiều bạn sử dụng.

    Sent from Rodgers Zone!!!

    0


  • Bạn cho mình hỏi:

    Mình có một layout.ejs như sau:

    <html>
    <title><% = title =></title>

    Mỗi lần get router mình truyền biến title, nếu như vậy lúc nào mình tạo router url đều truyền biến title, làm như vậy thì không hay ak.

    res.render('index', {
    title: 'Node js',
    });

    res.render('category', {
    title: 'Node js',
    });

    Có cách nào mình chỉ tạo một biến title để dùng chung cho toàn bộ website, mọi lúc mọi nơi ak, lúc nào muốn thay đổi thì mình mới truyền title.

    Tks



  • @Sang-Nhoc Híc. Cái này mình chịu. Vì mình ít dùng module render lắm. Mà nhớ mang máng là view engine + object data = html á

    Sent from Rodgers Zone!!!

    0


  • Ý mình là viết một hàm mà lúc nào cũng xử dụng được:

    Ví dụ: mình có hàm lấy ra danh sách menu sản phẩm, trang nào cũng sử dụng menu đó.

    Mỗi lần trang nào mình cũng require như vậy thì không hay ak.

    Giống như bên php có hàm init() mặc định lúc nào cũng chạy hàm này.

    Bên nodejs có cách nào không nhỉ.



  • @Sang-Nhoc Bạn xem sử dụng biến global nha. Do mình vẫn dùng import export. Vì mình theo trường phái biết tất cả những gì import và export.
    Còn init() của bạn thì giống constructor thôi:
    Cách 1:

    class DemoClass {
        constructor() {
        }
    }
    

    Cách 2:

    function DemoClass() {
        // Constructor code ở đây.
    }
    
    DemoClass.prototype.method = function() { // Code method ở đây }
    

    2 cách trên thfi khi gòi DemoClass thì constructor đều chạy. Bạn phối hợp 2 cái thì sẽ đạt được yêu cầu.

    Sent from Rodgers Zone!!!

    0


  • ý là mình chỉ gọi hàm một lần thôi ở app.js thì router nào cũng chạy như global vậy.

    Cách của bạn nó phải gọi lại liên tục ở mỗi router.

    Như global thì giả quyết OK, nhưng nó chỉ thực hiện nhưng dòng text ví dụ:

    global.copyright = "copyright @ 2018"

    Chứ thực thì một hàm có truy vấn mysql thì thấy cũng hơi rối, ngoài global còn cách nào không nhỉ.



  • @Sang-Nhoc Bạn xem việc sử dụng middle-ware nhé. Mình nghĩ có thằng đó đáp ứng viếc bạn muons đó. Có thể viết 1 middle-ware trước khi render trả về.

    Sent from Rodgers Zone!!!

    0


  • Theo mình biết middle ware thì khi get router từ server mới chạy, tức là mình vẫn truyền biến request. Thì mỗi router mình vẫn phải truyền vào render mới chạy.

    Bạn viết một project mà menu trang nào cũng có, mà menu lấy ra từ DB.

    Ví dụ:

    /user, /home, /contact, ....

    Nếu viết middle ware thì lúc nào mình cũng phải truyền $menu vào nó mới hiện, vậy thì rất cực và khó kiểm soát.

    Có cách nào viết mà mình không thông qua router và đi tới tempalte luôn như biên global vậy nhỉ



  • @Sang-Nhoc Tại vì mình chưa bao giờ dùng thằng render engine của các framework như EJS, etc... Mình dùng React và Angular thành 1 folder project để xử lỉ rieeng. Nên cũng hiểu nhưng chưa biết cách best choice để xử lí dùm bạn. Mình sẽ đá topic nên cho mọi người thảo luận. Vì câu hỏi hay.

    Middle ware thêm cái đằng sau bạn đừng gọi render. Bạn viết kiểu

    app.user((req, res) => {
      const data = req.data;
      data.title = 'Tittle';
     res.render(...);
    })
    

    Ý mình là như vầy. Để thằng middle-ware này render dùm bạn. Còn logic controller kia là lấy data rồi đính vào req.data sau đó gọi next để đi tiếp (Trên kiến thức mình về express nha) :))

    Sent from Rodgers Zone!!!

    0


  • Angular js thì mình thấy xử lý ok, tại mình thấy chèn thêm Angular vào sẽ làm web mình nặng.

    Tks bạn.



  • @Sang-Nhoc Nặng nếu bạn để chung resource thôi. Chứ nếu 2 phân. 1 API server. 1 Frontend Angularjs thì ko có vấn đề.

    Sent from Rodgers Zone!!!

    0

Log in to reply