Node.js 如何将数据同步插入mongo(Nodejs、Express)
我在使用node(express)向mongo db插入数据时遇到问题 我的代码如下所示:Node.js 如何将数据同步插入mongo(Nodejs、Express),node.js,mongodb,express,asynchronous,synchronous,Node.js,Mongodb,Express,Asynchronous,Synchronous,我在使用node(express)向mongo db插入数据时遇到问题 我的代码如下所示: 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
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' });});});
router.get('/data/:section/:sort',函数(req,res,next){
//总是在写入新数据之前删除旧数据
//Image.remove().exec();
var区段=请求参数区段;
var sort=req.params.sort;
//链接到igmurapi
var url='1〕https://api.imgur.com/3/gallery/“+section+'/'+sort+'/1';//末尾的1用于获取60多个图像(如果没有它,则仅提供60个)
请求({
url:url,
方法:“GET”,
标题:{
“授权”:“客户Id XXXXXXXXXXXX”
}},功能(e、r、主体){
var metadata=JSON.parse(body);
对于(var i=0;i使用承诺库,如
基本上,您需要做的是等待所有的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' });
})
var Q=require('Q');
var promiseArr=[];
对于(var i=0;i反复调用数据库是错误的做法,最好使用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){
// });
// };
});
});
router.get('/data/:section/:sort',函数(req,res,next){
//总是在写入新数据之前删除旧数据
//Image.remove().exec();
var区段=请求参数区段;
var sort=req.params.sort;
//链接到igmurapi
var url='1〕https://api.imgur.com/3/gallery/“+section+'/'+sort+'/1';//末尾的1用于获取60多个图像(如果没有它,则仅提供60个)
请求({
url:url,
方法:“GET”,
标题:{
“授权”:“客户Id XXXXXXXXXXXX”
}},功能(e、r、主体){
var metadata=JSON.parse(body);
Image.create(metadata.data,(err,result)=>{
//在这里做手术
res.render('index',{title:'SearchAPI'});
})
/*错误做法*/
//对于(var i=0;ibtw,独立应用程序一切正常。但在express中,它出错了异步/等待将在现在的js中起作用:)我不知道为什么,但它仍然只给我插入了20行:但我知道输入数据有650行,我只需要100行,我只是个白痴xD使用mongo cmd检查所有插入,所以它只给了我前20行,然后“键入更多”我没有注意到:D Thanx您的代码工作正常!但我认为我的代码工作正常,而您的代码也工作正常,但是响应抛出的时间比它应该的时间早得多。如果您的响应需要来自图像的内容,那么您可能会遇到问题。