01/10/2018, 11:22

Góp ý về node js models views controller

Em là new bie về node js em có viết một đoạn về mvc trong node js, bản thân nhận thấy có một số lũng cũng mong các cao nhân optimize giúp.

Code như sau

Phần model

var express = require('express')
, router = express.Router()

router.post('/:cmd', function (req, res) {
    var cmd=req.params.cmd;
    var sqlite3 = require('sqlite3').verbose();
    var repository = "testDB.db";
    var db = new sqlite3.Database(repository);
    var tbl="hs"; 
    switch (cmd) {
        case 'max_id':
            var sql="select * from "+tbl;
            db.all(sql,function(err,rows){
                if(err) throw err;
                var max=-1;
                for(var x in rows){
                    if( rows[x].id > max ){
                        max=rows[x].id;
                    }
                }
                res.json({max:max});
            });
            break;
        case 'lds':
            var sql="SELECT * from "+tbl;
            db.all(sql,function(err,rows){
                if(err) throw err;
                res.json({ds:rows});
            })
            break;
        case 'del':
            var r=req.body;
            var sql=[
                'delete from '+tbl,
                ' where id=? ',
            ].join('); 
            var data=[r.id];
            db.run(sql,data,function(err){
                if(err){
                    throw err;
                }
                res.json({msg:'delok'})
            })
            break;
        case "add":
            var r=req.body;
            var data=[r.id,r.name,r.tuoi,r.dia_chi,r.luong];
            var sql=[
                'insert into '+tbl,
                ' values (?,?,?,?,?) ',
            ].join('); 
            db.run(sql,data,function(err){
                if(err){
                    throw err;
                }
                res.json({msg:'addok'});
            })
            break;
    }//end switch
})
module.exports = router

Phần view

<% layout('layout1') -%>
  <h3>this is vdmodel index</h3>
  <script>
    var url = "<%=base_url+'/api/hs'%>";
    var app = angular.module('myApp', []);
    app.controller('myCtrl', function ($scope,$http) {
      $scope.msg = "hello world";
      $scope.lds = function () {
        var promise = $http({
          url: url + "/lds",
          method: "POST",
          headers: { 'Content-Type': 'application/json' },
        });
        return promise;
      };
      $scope.del = function (id) {
        var promise = $http({
          url: url + "/del",
          method: "POST",
          headers: { 'Content-Type': 'application/json' },
          data: {id:id},
        });
        return promise;
      };
      $scope.add = function (r) {
        var promise = $http({
          url: url + "/add",
          method: "POST",
          headers: { 'Content-Type': 'application/json' },
          data:r,
        });
        return promise;
      };
      $scope.max_id = function () {
        var promise = $http({
          url: url + "/max_id",
          method: "POST",
          headers: { 'Content-Type': 'application/json' },
        });
        return promise;
      };
      $scope.lds().then(function(res){
        $scope.ds=res.data.ds;
      })
      $scope.on_del=function(e){
        var id=e.target.id;
        $scope.del(id).then(function(res){
          var msg=res.data.msg;
          if(msg=='delok'){
            $scope.lds().then(function (res) {
              $scope.ds = res.data.ds;
            })
          }
        })
      }
      $scope.on_add=function(){
        $scope.max_id().then(function(res){
          var max=res.data.max;
          $scope.msg=max;
          var hs={
            id:max+1,
            name:'thuc71',
            tuoi:11,
            dia_chi:'htp',
            luong:1.11,
          }
          $scope.add(hs).then(function(res){
            var msg=res.data.msg;            
              if (msg == "addok") {
                $scope.lds().then(function (res) {
                  $scope.ds = res.data.ds;
                })
              }
          })
        })
      }
    });
  </script>
  <div ng-app="myApp" ng-controller="myCtrl">
    {{msg}}<br>
    <ul>
      <li ng-repeat="x in ds">
        {{x}}
        <button id="{{x.id}}" ng-click="on_del($event);">del</button>
      </li>
    </ul>
    <button ng-click="on_add();">add</button>
  </div>

kết quả

first screen

add screen

del screen

thank

viết 13:33 ngày 01/10/2018

Mình đang học nodejs, coi như newbie.

Thấy code bạn dùng sqlite hay quá, tại mình tưởng chỉ dùng mongodb đc thôi. File sql này lưu luôn trên server đc đúng k bạn? Bạn đã dùng mongodb chưa? Dùng rồi thì cách nào ổn bạn?

Thuc Nguyen Tan viết 13:25 ngày 01/10/2018

mongodb thì cũng như mysql bạn à, vậy thì xài luôn cái mysql luôn đi, dù sao có một độ dài lịch sử thì mysql tốt hơn.

Còn cái sqlite này thì file db lưu trên server luôn, dễ quản lý.

Mình thấy cái sqlite này cũng hay, giống cái web mà xài dữ liệu ms access ấy !!!

lite2210 viết 13:33 ngày 01/10/2018

Mở rộng project thì mới cần sửa code, còn demo thì như vậy được rồi.

Việc dùng mongo, mysql hay sqlite tùy thuộc vào yêu cầu project, mỗi cái sẽ có lợi hại khác nhau.
Còn không yêu cầu gì thì cứ xài cái nào thấy thích, đổi qua db khác cũng ko phải là việc gì quá to tát đối với những project như thế này.


Góp ý: bạn nên làm 1 project từ đầu đến cuối, từ đó sẽ học hỏi nhiều hơn là đi tối ưu 1 đoạn code như trên.

Ví dụ nhé, bạn đang cần 100k file pdf ebook trên máy tính thuộc nhiều danh mục khác nhau, muốn public online cho mọi người cùng xem, có thể tải về. Bạn sẽ làm thế nào để đảm bảo được yêu cầu này.

100k file đó lưu ở đâu, chia chuyên mục ntn, lưu = db gì, đọc online ntn, download ntn, quản trị ntn, có cho user upload thêm không, có gì quản lý thành viên ntn… rồi tới frontend sử dụng ntn, có cần dạng SAP như angular hay react ko… Mỗi bước bạn làm sẽ hình thành nên kinh nghiệm của bạn.

Thuc Nguyen Tan viết 13:34 ngày 01/10/2018

Theo thiển ý của em thì nên tổ chức ở mức tế bào cho tốt rồi mới tiếp tục cái dự án của anh. Ví dụ trong de mo của em thì có nên sửa cái gì cho hợp lý để thỏa mãn các mục tiêu.

  1. Tối thiểu là gen code bởi vì việc tương tác với một table cũng chỉ là : lds(lấy danh sách), add, del, update, find.

Bổ sung cho gen code:

lấy danh sách các column trong table

tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) {
  var columnParts = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(','); ///// RegEx
  var columnNames = [];
  for(i in columnParts) {
    if(typeof columnParts[i] === 'string')
      columnNames.push(columnParts[i].split(" ")[0]);
  }
  console.log(columnNames);
  ///// Your code which uses the columnNames;
});
  1. Có cách nào viết lại nó theo dạng myModel như trong codeigniter không, nếu viết được vậy thì ta chỉ kế thừa một số base function
  2. Có thể viết lại cái model theo dạng promise không, nếu được thì viết thế nào (Bạn để ý trong cái add function của mình ở trên thì đầu tiên phải ajax để lấy max của id, sau đến là cập nhật vào record hs để post lần nữa lần này mới thật sự add vào table)—> Sự cùi bắp là ở chổ này…!!!

Một dự án trung bình cũng cỡ chục cái table, nếu không tổ chức được cấp cell thì than ôi.
Vài lời mong các pro giúp đỡ, tối thiểu cũng là cho vài cái key word,

ps: cái demo của em cố gắng theo style của api restfull nhưng chắc là còn thiếu sót.

lite2210 viết 13:33 ngày 01/10/2018

Ý bạn là ORM phải không, nếu là orm thì có thể xài sequelize, 1 thư việc khá ngon lành để lưu db cỡ nhỏ, kết nối nhiều loại db, có define sẵn 1 mớ function findOne, findAll, findById, findByName, delete, update… đáp ứng được nhu cầu cơ bản.

Nếu bạn thích optimize những cái nhỏ thì mình góp ý cho:

  • data từ gửi browser lên ko kèm id, id do server tự tạo, browser t ko có quyền tạo, data truyền lên gồm có: name, tuoi, dia_chi, luong, api tự tìm id cuối cùng trong db rồi cộng thêm vào. Lúc nào sẽ có 2 query, bạn xem sql có hỗ trợ promise sẵn không, ko thì ép nó thành promise, hoặc callback lồng nhau.
  • Đặt tên biến cùng loại, tiếng anh thì tiếng anh luôn, việt thì việt luôn, không nên có name, dia_chi, on_del, ko biết thì google translate cũng được.
  • Rảnh thì kiếm cái host free up lên, thêm đc tí kinh nghiệm deploy.
Thuc Nguyen Tan viết 13:24 ngày 01/10/2018

Cám ơn nhé, sequelize, cái này có vẻ phức tạp đây, một thư viện đồ sộ thế, full document, mà viết ra để thiên hạ xài chơi, bái phục. Thôi gen code cho lành…

node js thuộc dạng bất đồng bộ, có thể là thế mạnh của nó.

Thuc Nguyen Tan viết 13:33 ngày 01/10/2018

lấy field sqlite cái này hay hơn

var sqlite3 = require('sqlite3').verbose();
var repository = "testDB.db";
var db = new sqlite3.Database(repository);
var table_name="hs";
var sql="pragma table_info ("+table_name+")";
db.all(sql,function(err,rows){
    if(err) throw err;
    for(x in rows){
        console.log(rows[x]);
    }
})    

and result

{ cid: 0,
  name: 'id',
  type: 'int',
  notnull: 1,
  dflt_value: null,
  pk: 1 }
{ cid: 1,
  name: 'name',
  type: 'text',
  notnull: 1,
  dflt_value: null,
  pk: 0 }
{ cid: 2,
  name: 'tuoi',
  type: 'int',
  notnull: 1,
  dflt_value: null,
  pk: 0 }
{ cid: 3,
  name: 'dia_chi',
  type: 'char(50)',
  notnull: 0,
  dflt_value: null,
  pk: 0 }
{ cid: 4,
  name: 'luong',
  type: 'real',
  notnull: 0,
  dflt_value: null,
  pk: 0 }

sqlite good job
happy, share for every one

Bài liên quan
0