2016-07-20 12 views
0

タイムカードのエントリを入力するフォームと以前のタイムカードのエントリのリストがあるWebページがあります。ユーザーがフォームを送信するたびに、そのエントリーがすぐにリストに表示されます。私がこれを行うと考えることができる唯一の方法は、SELECTクエリを2度、ページロード時に1度、そしてポストクエリ後にもう一度繰り返すことです。しかし、私は本当に同じクエリを2回繰り返す必要はありません。私のミドルウェアを構造化する良い方法があるので、私のコードを繰り返す必要はありませんか?Express.jsフォーム投稿:投稿時にリストアイテムを更新する

router.use(function(req, res, next) { 
    sql.connect(config).then(function() { 
    new sql.Request().query(` 
     SELECT company_id, company_name, project, category, start_time, end_time, duration, notes, date 
     FROM time_card 
     ORDER BY date DESC 
    `).then(function(timecard) { 
     res.locals.timecard = timecard; 
     console.log(res.locals.timecard); 
     next(); 
    }).catch(function(err) { next(err); }); 
    }).catch(function(err) { next(err); }); 
}); 

router.get('/', function(req, res){ 
    res.render('index', {}); 
}); 

router.post('/', function(req, res){ 
    req.checkBody(schema); 
    var errors = req.validationErrors(); 

    if(errors){ 
    console.log(req.body); 
    res.render('index', { errors: errors, body: req.body }); 
    }else{ 
    var timeStamp = req.body.date + ' ' + req.body.time; 
    var start = moment(timeStamp, 'MM/DD/YYYY hh:mm:ss a').toString(); 
    var end = moment(timeStamp, 'MM/DD/YYYY hh:mm:ss a').add(req.body.duration, 'milliseconds').toString(); 
    var inputs = req.body.project.split('-'); 
    var notes = req.body.notes ? req.body.notes : undefined; 
    sql.connect(config).then(function() { 
     new sql.Request() 
     .input('company_name', sql.NVarChar(50),  inputs[0].trim()) 
     .input('project',  sql.NVarChar(50),  inputs[1].trim()) 
     .input('category',  sql.NVarChar(50),  req.body.category) 
     .input('start_time', sql.DateTime2,   start) 
     .input('end_time',  sql.DateTime2,   end) 
     .input('duration',  sql.Int,    req.body.duration) 
     .input('notes',   sql.NVarChar(sql.MAX), notes) 
     .input('date',   sql.Date,    req.body.date) 
     .query(` 

     INSERT INTO time_card (company_name, project, category, start_time, end_time, duration, notes, date) 
     VALUES(
      @company_name, 
      @project, 
      @category, 
      @start_time, 
      @end_time, 
      @duration, 
      @notes, 
      @date 
     ) 
     `).then(function() { 
     res.render('index', { body: req.body }); 
     }).catch(function(err) { next(err); }); 
    }).catch(function(err) { next(err); }); 
    } 
}); 

答えて

0

問合せコードが重複しているか、データベース呼び出しが2回重複しているかを明確に理解できません。しかし、私はあなたを助けようとします:)

データをajaxとして投稿し、POSTで新しいタイムカードデータを返し、リロードページなしでページのリストに追加します。

タイムカードをメモリに保存し(例:app.locals.timecards)、タイムカードを使用して作成/更新/削除操作ごとに更新することもできます。