Express.js - foreach数据数组并将它们存储在数据库中
Express.js - foreach array of data and store them in the database
我正在使用 expressjs,bookshelf.js 我想要 post 数据数组,foreach 这样的数据并保存它。
我不确定问题出在哪里(快递、书架或只是普通的旧 javascript),但情况是这样的:当我 post 所述数组并尝试遍历时它,我得到了正确数量的保存到数据库中,但都具有数组中最后一项的值。
代码如下:
router.post('/save/', function(req, res){
var data = req.body;
var result = [];
for (var i in data) {
var d = data[i];
if (d.user_id == -1) d.user_id = null;
new Term().where({'date_of_driving': d.day})
.fetch()
.then(function(terms){
if (terms != null) {
return new Term({'id':terms.id}).save(d).then(function(item_updated){});
} else {
return new Term().save(d).then(function(item_saved){});
}
})
.catch(function(error){
console.log(error);
});
}
res.send({'saved': 'ok'});
});
我的理解是,这些调用是异步的,总是对最后的数据进行操作,因为for sentence比save快。我在做什么吗?
这个问题最好、最简单、最正确的解决方案是什么?
本质上,'then' 函数将异步执行,正如您所怀疑的那样,循环将继续独立执行。
我相信一种解决方案是定义一个函数,该函数基本上将参数 d
作为参考并使用它执行异步操作。所以这应该有效:
router.post('/save/', function(req, res){
var data = req.body;
var result = [];
for (var i in data) {
var d = data[i];
if (d.user_id == -1) d.user_id = null;
doTheThing(d);
}
res.send({'saved': 'ok'});
});
function doTheThing(d) {
new Term().where({'date_of_driving': d.day})
.fetch()
.then(function(terms){
if (terms != null) {
return new Term({'id':terms.id}).save(d).then(function(item_updated){});
} else {
return new Term().save(d).then(function(item_saved){});
}
})
.catch(function(error){
console.log(error);
});
}
从您的代码中不清楚您是希望运行并行查询还是顺序查询。
我假设是并行的,但你可以用 .each 替换 .map,它会 运行 顺序
router.post('/save/', function(req, res){
Promise.map(req.body, function(d) {
if (d.user_id == -1) d.user_id = null;
return new Term().where({'date_of_driving': d.day}).fetch().then(function(terms){
if (terms != null) {
return new Term({'id':terms.id}).save(d);
} else {
return new Term().save(d);
}
});
}).then(function() {
res.send({'saved': 'ok'});
}).catch(Promise.OperationalError, function(e) {
// Note that stack reveals internal server code so you might
// not want to send it over in production
res.status(400).send({stack: e.stack, message: e.message});
});
});
没有必要捕获错误只是为了记录它,所以我删除了它。只在你能处理的时候捕获错误。
我正在使用 expressjs,bookshelf.js 我想要 post 数据数组,foreach 这样的数据并保存它。
我不确定问题出在哪里(快递、书架或只是普通的旧 javascript),但情况是这样的:当我 post 所述数组并尝试遍历时它,我得到了正确数量的保存到数据库中,但都具有数组中最后一项的值。
代码如下:
router.post('/save/', function(req, res){
var data = req.body;
var result = [];
for (var i in data) {
var d = data[i];
if (d.user_id == -1) d.user_id = null;
new Term().where({'date_of_driving': d.day})
.fetch()
.then(function(terms){
if (terms != null) {
return new Term({'id':terms.id}).save(d).then(function(item_updated){});
} else {
return new Term().save(d).then(function(item_saved){});
}
})
.catch(function(error){
console.log(error);
});
}
res.send({'saved': 'ok'});
});
我的理解是,这些调用是异步的,总是对最后的数据进行操作,因为for sentence比save快。我在做什么吗?
这个问题最好、最简单、最正确的解决方案是什么?
本质上,'then' 函数将异步执行,正如您所怀疑的那样,循环将继续独立执行。
我相信一种解决方案是定义一个函数,该函数基本上将参数 d
作为参考并使用它执行异步操作。所以这应该有效:
router.post('/save/', function(req, res){
var data = req.body;
var result = [];
for (var i in data) {
var d = data[i];
if (d.user_id == -1) d.user_id = null;
doTheThing(d);
}
res.send({'saved': 'ok'});
});
function doTheThing(d) {
new Term().where({'date_of_driving': d.day})
.fetch()
.then(function(terms){
if (terms != null) {
return new Term({'id':terms.id}).save(d).then(function(item_updated){});
} else {
return new Term().save(d).then(function(item_saved){});
}
})
.catch(function(error){
console.log(error);
});
}
从您的代码中不清楚您是希望运行并行查询还是顺序查询。
我假设是并行的,但你可以用 .each 替换 .map,它会 运行 顺序
router.post('/save/', function(req, res){
Promise.map(req.body, function(d) {
if (d.user_id == -1) d.user_id = null;
return new Term().where({'date_of_driving': d.day}).fetch().then(function(terms){
if (terms != null) {
return new Term({'id':terms.id}).save(d);
} else {
return new Term().save(d);
}
});
}).then(function() {
res.send({'saved': 'ok'});
}).catch(Promise.OperationalError, function(e) {
// Note that stack reveals internal server code so you might
// not want to send it over in production
res.status(400).send({stack: e.stack, message: e.message});
});
});
没有必要捕获错误只是为了记录它,所以我删除了它。只在你能处理的时候捕获错误。