如何同步插入数据到 mongo (Nodejs, Express)
How to insert data to mongo synchronously (Nodejs, Express)
我在使用 node(express)
向 mongo 数据库插入数据时遇到问题
我的代码如下所示:
router.get('/data/:section/:sort', function(req, res, next) {
//Deleting old data always before writing new
//Image.remove().exec();
var section = req.params.section;
var sort = req.params.sort;
//Link to Igmur API
var url = 'https://api.imgur.com/3/gallery/'+section+'/'+sort+'/1'; //1 at the end is used to get more than 60 images(gives only 60 without it)
request.get({
url: url,
method: 'GET',
headers: {
'Authorization': 'Client-Id XXXXXXXXXXXXX'
}}, function(e, r, body){
var metadata = JSON.parse(body);
for(var i = 0; i<100; i++){
var image = new Image(metadata.data[i])
image.save(function(err, result){
});
};res.render('index', { title: 'SearchAPI' });});});
问题是我只插入了大约 20 个对象,而不是你在循环中看到的 100 个。
这一切都是因为节点只是在保存方法完全完成之前向前跳转。
我怎样才能解决这个问题?提前谢谢你
使用承诺库,例如 Q
您基本上需要做的就是等待所有 save
方法完成。使用等待所有内容执行的 Q.all
方法。
var Q = require('q');
var promiseArr = [];
for(var i = 0; i<100; i++){
var imgDefer = Q.defer();
var image = new Image(metadata.data[i])
image.save(function(err, result){
if(err)imgDefer.reject(err);
else imgDefer.resolve()
});
promiseArr.push(imgDefer);
}
Q.all(promiseArr).then (function (){
res.render('index', { title: 'SearchAPI' });
})
一次又一次地调用数据库是一种错误的做法,最好使用 create
并一次传递所有内容。看看下面的片段。希望对你有帮助。
router.get('/data/:section/:sort', function(req, res, next) {
//Deleting old data always before writing new
//Image.remove().exec();
var section = req.params.section;
var sort = req.params.sort;
//Link to Igmur API
var url = 'https://api.imgur.com/3/gallery/'+section+'/'+sort+'/1'; //1 at the end is used to get more than 60 images(gives only 60 without it)
request.get({
url: url,
method: 'GET',
headers: {
'Authorization': 'Client-Id XXXXXXXXXXXXX'
}}, function(e, r, body){
var metadata = JSON.parse(body);
Image.create(metadata.data,(err, result)=>{
//do operations here
res.render('index', { title: 'SearchAPI' });
})
/* WRONG PRACTICE */
// for(var i = 0; i<100; i++){
// var image = new Image(metadata.data[i])
// image.save(function(err, result){
// });
// };
});
});
我在使用 node(express)
向 mongo 数据库插入数据时遇到问题我的代码如下所示:
router.get('/data/:section/:sort', function(req, res, next) {
//Deleting old data always before writing new
//Image.remove().exec();
var section = req.params.section;
var sort = req.params.sort;
//Link to Igmur API
var url = 'https://api.imgur.com/3/gallery/'+section+'/'+sort+'/1'; //1 at the end is used to get more than 60 images(gives only 60 without it)
request.get({
url: url,
method: 'GET',
headers: {
'Authorization': 'Client-Id XXXXXXXXXXXXX'
}}, function(e, r, body){
var metadata = JSON.parse(body);
for(var i = 0; i<100; i++){
var image = new Image(metadata.data[i])
image.save(function(err, result){
});
};res.render('index', { title: 'SearchAPI' });});});
问题是我只插入了大约 20 个对象,而不是你在循环中看到的 100 个。 这一切都是因为节点只是在保存方法完全完成之前向前跳转。 我怎样才能解决这个问题?提前谢谢你
使用承诺库,例如 Q
您基本上需要做的就是等待所有 save
方法完成。使用等待所有内容执行的 Q.all
方法。
var Q = require('q');
var promiseArr = [];
for(var i = 0; i<100; i++){
var imgDefer = Q.defer();
var image = new Image(metadata.data[i])
image.save(function(err, result){
if(err)imgDefer.reject(err);
else imgDefer.resolve()
});
promiseArr.push(imgDefer);
}
Q.all(promiseArr).then (function (){
res.render('index', { title: 'SearchAPI' });
})
一次又一次地调用数据库是一种错误的做法,最好使用 create
并一次传递所有内容。看看下面的片段。希望对你有帮助。
router.get('/data/:section/:sort', function(req, res, next) {
//Deleting old data always before writing new
//Image.remove().exec();
var section = req.params.section;
var sort = req.params.sort;
//Link to Igmur API
var url = 'https://api.imgur.com/3/gallery/'+section+'/'+sort+'/1'; //1 at the end is used to get more than 60 images(gives only 60 without it)
request.get({
url: url,
method: 'GET',
headers: {
'Authorization': 'Client-Id XXXXXXXXXXXXX'
}}, function(e, r, body){
var metadata = JSON.parse(body);
Image.create(metadata.data,(err, result)=>{
//do operations here
res.render('index', { title: 'SearchAPI' });
})
/* WRONG PRACTICE */
// for(var i = 0; i<100; i++){
// var image = new Image(metadata.data[i])
// image.save(function(err, result){
// });
// };
});
});