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); });
}
});