Я пытаюсь запросить 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 с ненулевым кодом выхода.