node.js - 如何同步向mongo插入数据(Nodejs、Express)

标签 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 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 个对象。 所有这些都是因为 Node 在保存方法完全完成之前向前跳转。 我怎样才能解决这个问题?预先感谢您

最佳答案

使用 Promise 库,例如 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' });
})

关于node.js - 如何同步向mongo插入数据(Nodejs、Express),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40191639/

相关文章:

javascript - npm 运行脚本的命名参数

node.js - 如何在 Mongoose 查询中连接多个字段?

node.js - 如何在 Node.js 中使用 MongoDB $slice

java - 使用转义字符从单引号 JS 对象构造 Mongo DBObject?

java - 如何在 MongoDB Java 驱动程序中编写带有添加操作的 group by

javascript - Pug - 生成选择和选项

jquery - NW JS - 从 URL 下载并保存文件

node.js - 我如何设置我的后端服务器而不会在每次重启时覆盖数据

javascript - 我可以根据路由的模式将中间件应用于路由吗?

javascript - multer:保留原始图像文件名