You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:49:45