如何将Lambda人脸识别API的POST响应回传至Angular8应用
解决Lambda人脸识别API响应回传问题
核心问题在于你当前的recognizeImg函数是异步操作,但没有正确返回异步结果——unirest的请求完成后只会在回调里处理数据,而函数本身没有把这个结果传递出去。下面是具体的修改步骤:
1. 改造function.js:让recognizeImg返回Promise
我们需要把异步请求包装成Promise,这样就能在Route.js里等待请求完成后拿到结果:
this.recognizeImg = (url) => { // 返回一个Promise对象,包裹异步请求逻辑 return new Promise((resolve, reject) => { const requestString = "https://lambda-face-recognition.p.rapidapi.com/recognize"; const imgURL = url; unirest.post(requestString) .header("X-RapidAPI-Key", API_KEY) .attach("files", fs.createReadStream(createPath(imgURL))) .field("album", ALBUM_NAME) .field("albumkey", ALBUM_KEY) .end(result => { if (result.error) { // 请求失败时传递错误信息 console.error("Image recognition failed:", result.error); reject(result.error); } else { // 请求成功时传递响应体 console.log("successfully recognized image"); console.log(result.body); resolve(result.body); } }); }); }
2. 改造Route.js:使用async/await等待异步结果
因为现在recognizeImg返回Promise,我们可以把路由处理函数改成async,用await等待请求完成后再返回响应:
// 把回调函数标记为async,这样就能使用await facedetAPIRoutes.route("/").post(async function (req, res) { try { const imageUrl = req.body.url; // 等待recognizeImg的异步请求完成,拿到结果 const recognitionResult = await myFaceDetAPI.recognizeImg(imageUrl); // 将结果返回给Angular应用 res.status(200).json(recognitionResult); } catch (error) { // 处理请求失败的情况,返回错误状态码和信息 console.error("Error processing request:", error); res.status(500).json({ error: "Failed to process image recognition" }); } });
为什么原来的写法不行?
你之前直接调用myFaceDetAPI.recognizeImg(imageUrl)后立刻res.json(),但unirest的POST请求是异步的——这时候API请求还没完成,recognizeImg根本没有返回值,所以你传给前端的是undefined。用Promise+async/await可以确保我们在拿到API响应后再返回给前端。
Angular端的订阅(补充)
现在后端能正确返回响应了,Angular里用HttpClient发起POST请求并订阅即可:
// 示例:Angular服务中的方法 import { HttpClient } from '@angular/common/http'; constructor(private http: HttpClient) {} sendImageForRecognition(imageUrl: string) { return this.http.post('/your-route-path', { url: imageUrl }); } // 组件中调用并订阅 this.yourService.sendImageForRecognition(yourImageUrl).subscribe({ next: (result) => { console.log('Recognition result:', result); // 在这里处理返回的人脸识别结果 }, error: (err) => { console.error('Request failed:', err); // 处理错误情况 } });
内容的提问来源于stack exchange,提问作者Roger
相关产品推荐
相关产品推荐

