我有一个网页,其中包含输入时间卡条目的表单和以前的时间卡条目列表。每当用户提交表单时,我希望他们的条目立即显示在列表中。我能想到的唯一方法是重复SELECT查询两次,一次是在页面加载,一次是在post查询之后。但是我真的不想重复两次相同的查询。有没有更好的方法来构建我的中间件,所以我不必重复我的代码?
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 :(得分:0)
我不清楚你的问题是什么 - 重复的查询代码或两次数据库调用。但我会尽力帮助你:)
将数据作为ajax发布,在POST上返回新的时间卡数据成功并将其添加到页面列表中而不重新加载页面。
另一种方法是在内存中存储时间卡(例如app.locals.timecards
)并使用时间卡在每次创建/更新/删除操作时更新它。