如何将Alpha Vantage接口返回的数据传入Node.js的render方法
根因说明
你遇到的问题本质是异步执行顺序问题:request.get 属于异步网络请求,传入的回调函数只会在请求完成(成功/失败都算)后才会被触发执行。你原来的代码会先发起网络请求,然后立刻执行res.render("index"),此时回调还没运行,data还没有值,哪怕你赋值给外部变量,渲染时变量也还是未赋值的初始状态,自然取不到数据。
解决方法
把res.render的逻辑移动到request.get的回调函数内部,等请求完成拿到结果后再执行页面渲染,修改后的代码如下:
app.get('/', (req, res) => { const url = 'https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=IBM&interval=5min&apikey=apikey'; request.get({ url: url, json: true, headers: { 'User-Agent': 'request' } }, (err, resp, data) => { if (err) { console.log('Error:', err); // 错误场景传递错误信息给模板,方便前端提示 res.render("index", { stockData: null, error: '数据请求失败,请稍后重试' }); } else if (resp.statusCode !== 200) { console.log('Status:', resp.statusCode); res.render("index", { stockData: null, error: `接口异常,状态码:${resp.statusCode}` }); } else { // 成功获取数据后再渲染,把data传递给模板 res.render("index", { stockData: data, error: null }); } }) })
模板使用说明
你在对应的index模板中可以直接使用传递的变量,比如用EJS模板的话,要展示股票数据可以直接引用stockData,判断是否有错误可以读取error变量。
额外建议
request库官方已经停止维护,新项目可以考虑替换为axios或者Node.js原生的fetchAPI,异步写法更简洁,也更易维护。
内容的提问来源于stack exchange,提问作者forkbun882
相关产品推荐
相关产品推荐

