如何访问axios.get的Promise回调内变量并插入Postgres数据库
问题根源
axios.get是异步请求,JS引擎不会等待请求返回结果就会直接执行后续的InsertToDataBase.insertdatatolamp0代码,此时你要的rn0、ty0还没有被赋值- 你在then回调内部用var声明的rn0、ty0是函数作用域变量,仅在回调内部可访问,外部默认无法读取
解决方案
方案1:直接在then回调内执行入库操作
这是改动最小的实现方式,拿到异步返回结果后直接调用插入方法:
const axios = require('axios') const InsertToDataBase = require("./InsertToDataBase"); const username = 'admin' const password = 'admin' const token = Buffer.from(`${username}:${password}`, 'utf8').toString('base64') const urlLAMP_0 = 'http://127.0.0.1:8282/~/mn-cse/mn-name/LAMP_0/DATA/la' const urlLAMP_1 = 'http://localhost:8282/~/mn-cse/mn-name/LAMP_1/DATA/la' function getDataLAMP_0(){ axios.get(urlLAMP_0, { headers: { 'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin':'*', "X-M2M-RI":"OM2M-webpage", 'Authorization': `Basic ${token}`, 'Accept': 'application/json', 'mode': 'cors', 'credentials': 'include', } }) .then(function(response) { const cinData = response.data['m2m:cin'] document.getElementById("rn0").textContent = cinData.rn; const rn0 = cinData.rn; document.getElementById("ty0").textContent = cinData.ty; const ty0 = cinData.ty; document.getElementById("ri0").textContent = cinData.ri; document.getElementById("pi0").textContent = cinData.pi; document.getElementById("ct0").textContent = cinData.ct; document.getElementById("lt0").textContent = cinData.lt; document.getElementById("st0").textContent = cinData.st; document.getElementById("cnf0").textContent = cinData.cnf; document.getElementById("cs0").textContent = cinData.cs; document.getElementById("con0").textContent = cinData.con; // 拿到数据后直接调用插入方法 InsertToDataBase.insertdatatolamp0(rn0,ty0); }) } getDataLAMP_0();
方案2:用async/await语法优化异步逻辑
如果后续需要对返回数据做更多处理,用async/await语法逻辑更清晰,可读性更高:
const axios = require('axios') const InsertToDataBase = require("./InsertToDataBase"); const username = 'admin' const password = 'admin' const token = Buffer.from(`${username}:${password}`, 'utf8').toString('base64') const urlLAMP_0 = 'http://127.0.0.1:8282/~/mn-cse/mn-name/LAMP_0/DATA/la' const urlLAMP_1 = 'http://localhost:8282/~/mn-cse/mn-name/LAMP_1/DATA/la' // 声明为async异步函数 async function getDataLAMP_0(){ // 等待请求返回结果 const response = await axios.get(urlLAMP_0, { headers: { 'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin':'*', "X-M2M-RI":"OM2M-webpage", 'Authorization': `Basic ${token}`, 'Accept': 'application/json', 'mode': 'cors', 'credentials': 'include', } }) const cinData = response.data['m2m:cin'] document.getElementById("rn0").textContent = cinData.rn; const rn0 = cinData.rn; document.getElementById("ty0").textContent = cinData.ty; const ty0 = cinData.ty; document.getElementById("ri0").textContent = cinData.ri; document.getElementById("pi0").textContent = cinData.pi; document.getElementById("ct0").textContent = cinData.ct; document.getElementById("lt0").textContent = cinData.lt; document.getElementById("st0").textContent = cinData.st; document.getElementById("cnf0").textContent = cinData.cnf; document.getElementById("cs0").textContent = cinData.cs; document.getElementById("con0").textContent = cinData.con; // 返回需要的数据供外部使用 return {rn0, ty0} } // 用自执行异步函数等待数据返回后执行入库操作 (async () => { const {rn0, ty0} = await getDataLAMP_0() InsertToDataBase.insertdatatolamp0(rn0,ty0); })()
注意事项
如果你的代码运行在前端浏览器环境,直接连接PostgreSQL属于高危操作,会明文暴露数据库账号密码等敏感信息,建议把数据库操作迁移到后端服务,前端仅调用后端封装好的入库接口完成操作。
内容的提问来源于stack exchange,提问作者Badr-Eddine El mostaine
相关产品推荐
相关产品推荐

