Как преобразовать запрос CURL в запрос axios? - PullRequest
0 голосов
/ 30 октября 2019

Я только что успешно свернулся здесь:

curl -X POST https://jenkins-url/job/MyJob/job/some-job/job/master/build --user myemail:mypassword -H 'Jenkins-Crumb: mycrumb'

теперь я хочу использовать axios внутри моей лямбды

, поэтому у меня есть это:

const axios = require('axios')
exports.handler = async (event) => {
      const url = "my-url";
      try {
        const res = await axios.post(url, {}, {
            auth: {
              username: 'user',
              password: 'passowrd'
            },
            headers: {
                "Content-Type": "application/x-www-form-urlencoded",
                "Jenkins-Crumb": "my-crumb"
            },
          }).then(function(response) {
            console.log('Authenticated');
          }).catch(function(error) {
            console.log('Error on Authentication');
          });
        console.log(res)
        return {
            statusCode: 200,
            body: JSON.stringify(res)
        }
    } catch (e) {
        console.log(e)
        return {
            statusCode: 400,
            body: JSON.stringify(e)
        }
    }
};

но когда явызвать лямбду, которую он возвращает: failed with the error "Request completed but is not OK"

не уверен, что я где-то делаю что-то не так, но похоже, что все правильно отображается из CURL в axios

1 Ответ

1 голос
/ 30 октября 2019

У вас есть несколько проблем:

  1. В вашем обработчике .then(...) вы ведете консольный журнал, но вы не возвращаете что-либо из этой функции. Следовательно, res будет undefined.
  2. Вы делаете JSON.stringify на res. res будет ответом axios , а не телом ответа. Строгание ответа axios - плохая идея, потому что оно содержит здоровенные ссылки на объекты, а также циклические ссылки. Вы хотите, чтобы res.data предоставил вам данные ответа.
  3. Ошибка, возвращаемая Axios, также может содержать эти тяжелые объекты и циклические ссылки. По моему опыту, вы можете фактически вызвать сбой узла при попытке сериализации ответов и ошибок из axios.

Вот как я могу изменить вашу функцию:

const axios = require('axios')

exports.handler = async (event) => {
  const url = "my-url";
  try {
    const res = await axios.post(url, {}, {
      auth: {
        username: 'user',
        password: 'passowrd'
      },
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        "Jenkins-Crumb": "my-crumb"
      },
    });

    return {
      statusCode: 200,
      body: JSON.stringify(res.data)
    }
  } catch (e) {
    console.log(e)
    return {
      statusCode: 400,
      // Don't do JSON.stringify(e). 
      // e.response.data will be the axios response body,
      // but e.response may be undefined if the error isn't an HTTP error
      body: e.stack
    }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...