【发布时间】:2023-04-04 21:06:01
【问题描述】:
所以我有一个发布路由,它是一个异步等待函数,我在其中有一个 reuest,它从 api 中提取一些数据,我想将该主体的内容保存在请求函数外部的变量中
我尝试过使用 Promise,但我对此并不十分熟悉。
//@route POST api/portfolio/stock
//@desc Create or update a user's stock 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 newPortfolio = {};
newPortfolio.user = req.user.id;
newPortfolio.stocks = [];
if(stock) newPortfolio.stocks.stock = stock;
if(qty) newPortfolio.stocks.qty = qty;
request(`https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=${stock}&apikey=${config.get(
"API_KEY")}`, (error, response, body) => {
if (error) console.error(error);
if (response.statusCode !== 200) {
res.status(404).json({msg: 'No stock found'});
}
let content = JSON.parse(body);
let quote = content['Global Quote'];
});
newPortfolio.stocks.stockInfo = quote;
try {
let portfolio = await Portfolio.findOne({ user: user.req.id });
//update if exists
if(portfolio) {
portfolio = await Portfolio.findOneAndUpdate(
{ user: user.req.id },
{ $push: { stocks: newPortfolio.stocks }}
);
return res.json(portfolio);
}
//create if not found
portfolio = new Portfolio(newPortfolio);
await portfolio.save();
res.json(portfolio);
} catch (err) {
console.error(err.message);
res.status(500).send("Server Error");
}
}
);
我想使用该请求的正文保存 myPortfolio.stocks.stockInfo。
【问题讨论】:
-
你没有。您在
request()回调中继续您的函数的其余部分,因为这是body数据可用的唯一地方。这是 Javascript 中异步编程的基础知识。你也可以使用 Promise 和async/await,但这需要你学习如何正确使用 Promise 和async/await才能正确使用它。提示,request-promise库是request库的承诺返回版本。
标签: javascript node.js api asynchronous request