首页 > 解决方案 > 从函数返回超级代理响应对象

问题描述

我正在使用superagent从 Node.s 进行 HTTP API 调用,这就是我的代码现在的样子:

async function getProjectParameterValue(projectId, parameter) {
    let projectParamsUrl = "some/endpoint" + projectId + "/parameters/";
    let url = "http://baseUrl/" + projectParamsUrl + parameter;
    return await superagent.get(url).auth(userName, password)
        .type('json')
        .accept('json')
        .then(response => {
            return response.body;
        })
        .then(responseBody => {
            return responseBody;
        });
}

在这种情况下,该函数getProjectParameterValue返回一个必须在外部调用它后解决的承诺,如下所示:

getProjectParameterValue("myProjectId", "someParameter")
    .then(responseBody => {
       log.info(responseBody);
    });

我正在寻找某种方法让函数getProjectParameterValue直接返回超级代理响应对象。有什么办法可以做到这一点?

标签: node.jssuperagent

解决方案


所以有几件小事:

  1. 一个 Promise 解析为它的返回值
  2. 当它等待的 aync 行为完成时,Promise 将解析
  3. 您可以“等待” Promise 的已解决值,或返回 Promise 并使用 .then() 创建具有新已解决值的新 Promise

在你的例子中。你的 Promise 解析为响应的正文,因此使用该 Promise 的任何人都只能访问响应正文。

因此,您希望解决响应本身而不是正文。

另请注意,当返回 Promise 时,无需添加 aync/await。所有这一切都是添加另一个解析为现有解析值的 .then() ,这是不必要的

function getProjectParameterValue(projectId, parameter) {
    const url = `http://baseUrl/some/endpoint${projectId}/parameters/${parameter}`;

    return superagent
      .get(url)
      .auth(userName, password)
      .accept('json');
}

getProjectParameterValue("myProjectId", "someParameter")
    .then((res) => {
       log.info(res.body);
    });

替代等待:

function getProjectParameterValue(projectId, parameter) {
    const url = `http://baseUrl/some/endpoint${projectId}/parameters/${parameter}`;

    return superagent
      .get(url)
      .auth(userName, password)
      .accept('json');
}

const res = await getProjectParameterValue("myProjectId", "someParameter")
log.info(res.body);

推荐阅读