【问题标题】:mongoose insert data with promise猫鼬用承诺插入数据
【发布时间】:2014-12-22 22:36:55
【问题描述】:

如果不存在,我的目标是在数据库中插入一个新国家(带有递增的 country_id)。在这种情况下,我尝试获取最大的 country_id 并插入一个 country_id + 1 的新国家/地区。否则我什么都不做。

readFile 是对 readfile 的承诺, filetoArray 将该文件内容更改为数组, processMap 处理每个数组元素并决定我们是否将信息存储到 mongodb

问题是:

promise.promisifyAll(Country.findOne({}).sort({'zid' : -1}).exec()

即使某些数据已经插入数据库,也总是给我相同的结果...

非常感谢任何建议。谢谢。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var CountrySchema = new Schema({
    zn: {type: String, required: true},
    zid: {type: Number, required: true}
});

var promise = require('bluebird');

function processMap(data){
    return promise.bind(data).then(insertCountry);
}

var insertCountry = function() {
    var googledata = this;  // from bind promise
    return promise.promisifyAll(Country.findOne({zn: googledata.country}).exec())
    .then(function(dbdata){ return {dbdata: dbdata, googledata: googledata}; })
    .then(insertCountryIfNotExist)
}

var insertCountryIfNotExist = function(data){
    return promise.promisifyAll(Country.findOne({}).sort({'zid' : -1}).exec())
    .then(function(d){
        var newc = new Country({zn: data.googledata.country, zid: d.zid + 1});
        return promise.promisifyAll(newc.saveAsync())
    });
}

// main code is here
readFile(file)
.then(filetoArray)
.map(processMap, {concurrency: 1})  // end of then
.then(function(data){
    console.log('done');
})

【问题讨论】:

  • Promisify 模型本身,如Promise.promisifyAll(mongoose.model('Country')),然后使用添加的Async 方法(如findOneAsync

标签: node.js map mongoose promise bluebird


【解决方案1】:

实际上 Exec 返回一个继承自 mpromisepromise,没有必要在你的情况下使用 bluebird,或者如果你想使用 bluebird,那么不要将 mongoose 承诺与 bluebird 混合。

一些例子:

var insertCountry = function() {
    var googledata = this;
    return Country.findOne({zn: googledata.country}).exec()
    .then(function(dbdata){ 
         return {dbdata: dbdata, googledata: googledata}; 
     })
    .then(function(data){
       return Country.findOne({}).sort({'zid' : -1}).exec()
          .then(function(d){
           var newc = new Country({zn: data.googledata.country, zid: d.zid + 1});
           return newc.save();
       })
    })
}

【讨论】:

  • 另一个问题。我声明了一个函数,例如: getmaxcid = Country.findOne({}).sort({'zid' : -1}).exec();并替换上面的代码以返回 getmaxcid.then(d){xxxx}。这不起作用。你能告诉我这里发生了什么吗? (这是否意味着您不能声明函数并重用代码......?)
  • 对不起,每次使用promise中的数据/参数时都需要定义一个函数
  • 我明白了。我声明了一个函数并改为调用它。似乎该函数将创建(并返回)一个新的承诺,而不是永远给我相同的完成承诺......谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 2014-03-27
  • 2012-12-14
  • 2017-06-15
  • 2019-06-04
  • 2017-08-18
  • 2018-02-15
相关资源
最近更新 更多