Как сохранить массив данных Web Api в дочернюю родительскую схему во вложенной схеме мангуста? - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь сохранить результат Web Api, который содержит несколько массивов данных для заполнения биржевой диаграммы. Каждый раз, когда я ввожу символ и нажимаю кнопку «Получить цитату», он должен получить данные из веб-интерфейса API, сохранить их под дочерней схемой в базе данных. Как я могу сделать это с помощью nodejs и mongoose? Вот код, который я пробовал ....

Папка - Модели - Stock.js

const mongoose = require('mongoose')
mongoose.Promise = global.Promise
mongoose.connect('mongodb://localhost:27017/myapp', { useNewUrlParser: true })
const slug = require('slug')


const childSchemaData = new mongoose.Schema({
  date: mongoose.Decimal128,
  open: mongoose.Decimal128,
  high: mongoose.Decimal128,
  low: mongoose.Decimal128,
  close: mongoose.Decimal128,
  volume: mongoose.Decimal128
})

const parentSchemaSymbol = new mongoose.Schema({
  symbol: {
    type: String,
    trim: true,
    minlength: 2,
    maxlength: 4,
    required: 'Plese enter a valid symbol, min 2 characters and max 4'
  },
  // Array of subdocuments
  data: [childSchemaData],
  slug: String

});

//we have to PRE-save slug before save the parentSchemaSymbol into DB
parentSchemaSymbol.pre('save', function (next) {
  if (!this.isModified('symbol')) {
    next()//skip it
    return//stop this function from running
  }
  this.slug = slug(this.symbol)
  next()
  //TODO make more resiliant soslug are unique
})

module.exports = mongoose.model('Stock', parentSchemaSymbol)

Контроллер - webApiController.js

const mongoose = require('mongoose')
const axios = require('axios')

require('../models/Stock')
const parentSchemaSymbol = mongoose.model('Stock')



mongoose.Promise = global.Promise // Tell Mongoose to use ES6 promises
// Connect to our Database and handle any bad connections
mongoose.connect('mongodb://localhost:27017/myapp', { useNewUrlParser: true })
mongoose.connection.on('error', (err) => {
  console.error(`? ? ? ? ? ? ? ? → ${err.message}`)
})

exports.webApi = (req, res) => {
  let curValue = req.params.symbol

  axios.get(`https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=${curValue}&outputsize=compact&apikey=TUVR`)
    .then(response => {
      return highLow = Object.keys(response.data['Time Series (Daily)']).map(date => {
        return [
          Date.parse(date),
          Math.round(parseFloat(response.data['Time Series (Daily)'][date]['1. open']) * 100) / 100,
          Math.round(parseFloat(response.data['Time Series (Daily)'][date]['2. high']) * 100) / 100,
          Math.round(parseFloat(response.data['Time Series (Daily)'][date]['3. low']) * 100) / 100,
          Math.round(parseFloat(response.data['Time Series (Daily)'][date]['4. close']) * 100) / 100,
          parseInt(response.data['Time Series (Daily)'][date]['5. volume'])
        ]
      })

    })
    .then(_ => {
      let curValueSchema = new parentSchemaSymbol()
      curValueSchema.symbol = curValue;
      curValueSchema.data.push(highLow);
      curValueSchema.slug = 'String';
      curValueSchema.save().then(doc => {
        console.log('Saved the symbol', doc)
        res.send(highLow)
      }).catch(e => {
        console.log(e)
      })
    })
    .catch(error => {
      console.log(error);
    })
}

Результат веб-API = HighLow

enter image description here

1 Ответ

0 голосов
/ 15 ноября 2018

Пожалуйста, взгляните на ваш запрос-запрос axios и измените его на

axios.get(`https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=${curValue}&outputsize=compact&apikey=TUVR`)
.then(response => {
  return highLow = Object.keys(response.data['Time Series (Daily)']).map(date => {
    return {
      data :Date.parse(date),
      open : Math.round(parseFloat(response.data['Time Series (Daily)'][date]['1. open']) * 100) / 100,
      high :Math.round(parseFloat(response.data['Time Series (Daily)'][date]['2. high']) * 100) / 100,
      low : Math.round(parseFloat(response.data['Time Series (Daily)'][date]['3. low']) * 100) / 100,
      close : Math.round(parseFloat(response.data['Time Series (Daily)'][date]['4. close']) * 100) / 100,
      volume : parseInt(response.data['Time Series (Daily)'][date]['5. volume'])
    }
  })

})
.then(_ => {

  let curValueSchema = new parentSchemaSymbol()
  curValueSchema.symbol = curValue;

for(x in highLow){

    curValueSchema.data.push(highLow[x])
}

  curValueSchema.save().then(doc => {
    console.log('Saved the symbol', doc)
    return res.send(highLow)
  }).catch(e => {
    console.log(e)
  })
})
.catch(error => {
  console.log(error);
})

И в Схеме я не знаю, что this.slug = slug(this.symbol) это делает, но чтобы использовать этот метод слизня, вы должны определить его или импортировать, иначе он просто выдаст ошибки, надеюсь, это поможет вам

...