Express路由调用独立文件封装的Axios逻辑返回undefined如何解决
核心问题说明:你封装的
inventoryRequest函数没有返回任何值,axios的.then()里的return只是回调函数的返回值,不会作为外层函数的返回结果;同时axios请求是异步操作,必须等待异步执行完成才能拿到返回值。
第一步:修正抽离的请求工具函数
修改./lib/inventory-request.js代码,要么直接返回axios生成的Promise对象,要么用async/await简化异步逻辑:
const axios = require('axios').default; const base_api_url = 'some_url'; // 写法1:async/await 写法(更易读,推荐) module.exports = async function(){ const headers = { "Content-Type": "application/graphql" } const data = `{}` try { const response = await axios.post(base_api_url, data, { headers }) return response.data } catch (error) { return 'no' } }; // 写法2:直接返回Promise(和你原有写法兼容性更高) /* module.exports = function(){ const headers = { "Content-Type": "application/graphql" } const data = `{}` // 重点:外层函数返回axios的Promise对象 return axios.post(base_api_url, data, { headers: headers }) .then((response) => { return response.data }) .catch((error) => { return 'no' }) }; */
第二步:修正路由调用逻辑
路由处理函数需要标记为async,用await等待异步请求完成后再取值:
// 先引入封装好的请求函数 const inventoryRequest = require('./lib/inventory-request') server.post('/inventory-request', async (req, res) => { // 等待异步请求执行完成再取值 const inventoryData = await inventoryRequest() console.log(inventoryData) // 注意必须给请求方返回响应,否则接口会超时 res.send(inventoryData) })
补充规范说明
- 所有异步IO操作(网络请求、数据库读写等)封装为工具函数时,必须返回Promise对象或声明为async函数
- 调用异步函数需要获取返回值时,必须在async函数内使用await关键字,或通过
.then()链式回调取值 - 生产环境建议给路由添加全局异常捕获,避免未处理的异步错误导致服务进程崩溃
内容的提问来源于stack exchange,提问作者frank magadino
相关产品推荐
相关产品推荐

