Node.js中如何正确调用getKeys()?解决undefined及await语法错误
如何正确调用Node.js中的getKeys()函数?
问题现象
- 直接调用
getKeys()时,控制台输出undefined - 使用
await getKeys()调用时,抛出语法错误:
await getKeys();
^^^^^SyntaxError: await is only valid in async function
原代码如下:
const express = require('express') const axios = require('axios') const app = express() app.get("/", async(req, res) => { try { const response = await axios.get("https://m.myapp2go.de/services/APIgetblz") res.json(response.data) } catch (err) { console.log(err) } }) async function getKeys() { try { const response = await axios.post('https://m.myapp2go.de/services/APIgetblz'); const data = response.items; console.log(data); //res.send(data); } catch (e) { console.log(e.message); } } getKeys(); app.get('*', (req, res) => { res.status(500).json({ message: "error" }) }) app.listen(3001)
问题原因
- 输出undefined的核心原因:
- 根路由用
axios.get能成功获取数据,但getKeys里用了axios.post,如果该接口仅支持GET请求,会导致返回数据异常; - axios请求的返回数据存在于
response.data中,而非response.items,错误的取值路径直接导致输出undefined。
- 根路由用
- await报错的原因:
await关键字只能在async标记的函数内部使用,全局作用域不属于async函数,直接使用会触发语法错误。
解决方案
第一步:修复getKeys函数的逻辑
先修正接口请求方式和数据提取路径:
async function getKeys() { try { // 改用GET请求(和根路由一致,确保接口支持) const response = await axios.get('https://m.myapp2go.de/services/APIgetblz'); // 正确提取接口返回的数据 const data = response.data; console.log(data); return data; // 返回数据,方便后续调用时处理 } catch (e) { console.error('获取数据失败:', e.message); throw e; // 抛出错误,让调用方可以捕获处理 } }
第二步:正确调用getKeys函数
有三种常用的正确调用方式:
方式1:通过Promise的.then()处理结果
在全局作用域直接调用,利用Promise链式回调处理数据和错误:
getKeys() .then(data => { console.log('成功获取数据:', data); // 这里可以添加数据处理逻辑 }) .catch(err => { console.error('调用getKeys失败:', err); });
方式2:用立即执行异步函数包裹await
创建一个异步的立即执行函数,在内部使用await:
(async () => { try { const data = await getKeys(); console.log('成功获取数据:', data); // 处理数据逻辑 } catch (err) { console.error('调用getKeys失败:', err); } })();
方式3:在Express路由中调用
如果需要在接口路由里使用getKeys的结果,直接在async路由处理函数中使用await即可:
app.get('/get-keys', async (req, res) => { try { const data = await getKeys(); res.json(data); } catch (err) { res.status(500).json({ message: '获取密钥数据失败' }); } });
内容的提问来源于stack exchange,提问作者Ralf Bordé
相关产品推荐
相关产品推荐

