如何在猫鼬模式中使用异步默认值?

时间:2020-07-12 11:38:44

标签: javascript node.js mongoose promise axios

我试图获取一个日期时间并在我的猫鼬模式中使用它,即使我更改了heroku上的设置,服务器仍返回错误的时区。我试图通过使用axios请求在架构上设置默认日期。但这是行不通的,因为它是一个承诺。我有什么办法可以以某种方式提取价值?我到处都看过了,但是他们所有人都使用回调,但是我不认为是否可以在这里进行。

var pricesSchema = mongoose.Schema({
  USD_LOWEST: {
    type: Number,
    required: true
  },
  USD_LOW: {
    type: Number,
    required: true
  },
  USD_HIGH: {
    type: Number,
    required: true
  },
  USD_HIGHEST: {
    type: Number,
    required: true
  },
  USD_CBA: {
    type: Number,
    required: true
  },
  BTC_PRICE: {
    type: Number,
    required: true
  },
  date: {
    type: String,
    default : function(){
      axios.get('http://worldtimeapi.org/api/timezone/Asia/Yerevan').then(data=>{
        return data.datetime;
      })
    }
  }
});

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我不认为模型/方案可以是异步的,但是由于您需要异步默认值,因此可以尝试以下操作:

const pricesSchema = mongoose.Schema({
  USD_LOWEST: {
    type: Number,
    required: true,
  },
  USD_LOW: {
    type: Number,
    required: true,
  },
  USD_HIGH: {
    type: Number,
    required: true,
  },
  USD_HIGHEST: {
    type: Number,
    required: true,
  },
  USD_CBA: {
    type: Number,
    required: true,
  },
  BTC_PRICE: {
    type: Number,
    required: true,
  },
  date: {
    type: Date,
    expires: 60 * 60 * 24 * 7,
  },
});


pricesSchema.pre('save', async function () {
  if (!this.date) {
    const response = await axios.get('http://worldtimeapi.org/api/timezone/Asia/Yerevan');
    this.date = response.data.datetime;
  }
});

export const Price = mongoose.model('Prices', pricesSchema);