Как получить данные из API и сохранить их в массиве схемы mongodb? - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь запросить API в nodejs и сохранить полученные в теле данные в массив, а затем передать этот массив в схему mongodb, но у меня возникли проблемы с этим.Я получаю необработанное предупреждение об ошибке.

Я пробовал это.

//@route POST api/portfolio/stock
//@desc post new stock to the portfolio.
//@access private
router.post(
  "/stock",
  auth,
  [
    check("symbol", "symbol is require or incorrect.")
      .not()
      .isEmpty(),
    check("qty", "Quantity of the stock purchased is required")
      .not()
      .isEmpty()
  ],
  async (req, res) => {
    const errors = validationResult(req);
    if(!errors.isEmpty) {
        return res.status(400).json({ errors: errors.array() });
    }

    const {
        stock,
        qty
    } = req.body

    const newStock = {
        stock,
        qty,
        price,
        lastclose,
        change,
        open,
        high,
        low,
        volume,
        changepercent
    }

    try {
        const portfolio = await Portfolio.findOne({ user: req.user.id });

        const options = {
            uri: `https://https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=${stock}&apikey=${config.get('API_KEY')}`,
            method: 'GET',
            headers: { 'user-agent': 'node.js' }
        }; 

        request(options, (error, response, body) => {
            if(error) console.error(error);

            if(response.statusCode !== 200){
                res.status(404).json({msg: 'No stock for this symbol found. '});
            }

            const content = JSON.parse(body);
            const quote = content['Global Quote'];
            newStock.price = quote['05. price'];
            newStock.lastclose = quote['08. previous close'];
            newStock.change = quote['09. change'];
            newStock.open = quote['02. open'];
            newStock.high = quote['03. high'];
            newStock.low = quote['04. low'];
            newStock.volume = quote['06. volume'];
            newStock.changepercent = quote['10. change percent'];



        });

        portfolio.stocks.unshift(newStock);

        await portfolio.save();

        res.json(portfolio);


    } catch (err) {
      console.error(err.message);
      res.status(500).send("Server Error");
    }
  }
);

Схема Mongoose:

const PortfolioSchema = new mongoose.Schema({
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "user"
  },
  stocks: [
    {
      stock: {
        type: String,
        required: true
      },
      qty: {
        type: String,
        required: true
      },
      price: {
        type: String
      },
      lastclose: {
        type: String
      },
      change: {
        type: String
      },
      open: {
        type: String
      },
      high: {
        type: String
      },
      low: {
        type: String
      },
      volume: {
        type: String
      },
      changepercent: {
        type: String
      }
    }
  ],
  date: {
    type: Date,
    default: Date.now
  }
});

Отображается ошибка:

UnhandledPromiseRejectionWarning: ReferenceError: цена неопределено в router.post (C: \ Users \ Saksham \ Projects \ Invenst \ router \ api \ portfolio.js: 62: 9) в Layer.handle [как handle_request] (C: \ Users \ Saksham \ Projects \ Invenst \ node_modules\ express \ lib \ router \ layer.js: 95: 5) на следующем (C: \ Users \ Saksham \ Projects \ Invenst \ node_modules \ express \ lib \ router \ route.js: 137: 13) на runner.then.ошибки (C: \ Users \ Saksham \ Projects \ Invenst \ node_modules \ express-validator \ check \ check.js: 16: 7) в process._tickCallback (внутренняя / process / next_tick.js: 68: 7) (узел: 7680) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(идентификатор отклонения: 2) (узел: 7680) [DEP0018] Предупреждение об устаревании: отклонения необработанного обещания устарели.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

1 Ответ

0 голосов
/ 15 июня 2019

Узел жалуется на необъявленные переменные в вашем коде. Все необъявленные переменные находятся в вашем объекте newStock . Чтобы создать новую схему мангуста, вам нужно позвонить const newStock = new PortfolioSchema({...}).

Тогда вы вообще не вставляете документ в базу данных; как только у вас появится новый объект, попробуйте передать его в методе insert : Portfolio.insert(newStock)

Пожалуйста, посмотрите на это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...