如何将Axios请求返回值赋值给变量并在后续代码中正常访问
问题原因
你的代码存在几个异步逻辑和变量使用错误,直接导致无法拿到正确的返回值:
postData虽然声明为async函数,但没有返回axios请求的Promise,await postData()实际等待的是undefined,自然拿不到返回的assessmentId- 路由里你把调用
postData的逻辑套在了一个独立的立即执行async函数里,代码不会等待这个函数执行完毕就直接执行了后面的res.send,此时异步请求还没完成,assessmentId还没被赋值 - 变量名多处不匹配:一是
postData的形参写的是大写URL,函数内部用的是小写url;二是最后res.send里写的是全小写assessmentid,和你定义的驼峰assessmentId大小写不匹配,JavaScript大小写敏感,就算前面拿到值这里也会报错 - 调用
postData时传参错误,你定义的postData需要5个入参,实际调用时只传了4个,还用到了未定义的jobTitle1变量
修正后的代码
修正postData函数
async function postData (first_name,last_name, email, url, token) { var data = { "assessmentStatusWebHook": "http://localhost:3000/api/hook", "notifyAssessmentAvailableUsingEmail": 1, "firstName": first_name, "lastName": last_name, "email": email } // 这里要return axios的返回值,async函数才会返回正确的Promise return axios.post(url, data, {headers: {'Accept': 'application/json'}}) .then((res) => { console.log(`Status: ${res.status}`); return res.data.assessmentId }).catch((err) => { console.error(err); throw err // 把错误抛出去,上层才能catch到 }); };
修正路由逻辑
router.post("/send_tests", [ check('partner_test_id').exists(), check('first_name').exists().isString(), check('last_name').exists().isString(), check('resume_url').optional(), check('phone_number').optional().isString(), check('email').exists().isEmail().normalizeEmail(), check('url').exists().isString()], async (req, res) => { // 先校验参数,有错误直接返回,不用走后面的请求逻辑 const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(422).json({ errors: errors.array() }); } let partner_test_id = req.body.partner_test_id; let first_name = req.body.first_name; let last_name = req.body.last_name; let resume_url = req.body.resume_url; let phone_number = req.body.phone_number; let email = req.body.email; let url = req.body.url; // 这里如果有token从req里取,对应传给postData,不需要可以删除该参数 let token = req.body.token || ''; let assessmentId try { // 直接await即可,不需要额外套立即执行函数,路由本身已经是async的 assessmentId = await postData(first_name,last_name, email, url, token) } catch (err){ console.log ('Errorrrrrrr' + err) return res.status(500).json({error: '请求第三方接口失败'}) } console.log("In the function for assessmentID " + assessmentId) res.send({ // 变量名和上面保持一致,使用驼峰写法 "partner_interview_id": assessmentId }); });
内容的提问来源于stack exchange,提问作者khan Safi
相关产品推荐
相关产品推荐

