@DeboshiR
Свободу разработчикам!!!

Как дождаться выполнения сurl?

Есть примерной такой код:
var { exec } = require("child_process");

var cmd = `curl -X POST https://secure.payu.com/api/v2_1/orders -H "Content-Type: application/json" -H "Authorization: Bearer 3e5cac39-7e38-4139-8fd6-30adc06a61bd" -d '{ "notifyUrl": "https://your.eshop.com/notify", "customerIp": "127.0.0.1", "merchantPosId": "145227", "description": "RTV market", "currencyCode": "PLN", "totalAmount": "21000", "buyer": {     "email": "john.doe@example.com",     "phone": "654111654",     "firstName": "John",     "lastName": "Doe",     "language": "pl" }, "products": [     {         "name": "Wireless Mouse for Laptop",         "unitPrice": "15000",         "quantity": "1"     },     {         "name": "HDMI cable",         "unitPrice": "6000",         "quantity": "1"     } ]}'`;

function execCmd() {
  this.execCommand = function (cmd, callback) {
    exec(cmd, (error, stdout, stderr) => {
      if (error) {
        console.error(`error: ${error}`);
        return;
      }

      if (stderr) {
        console.error(`stderr: ${stderr}`);
        return;
      }

      callback(stdout);
    });
  };
}

var os = new execCmd();

os.execCommand(cmd, function (result) {
  console.log(result);
});

Выполнение кода выводит в консоль только
stderr:   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1098  100   551  100   547   1088   1081 --:--:-- --:--:-- --:--:--  2169

Вероятно это из-за того, что js завершает работы ещё до того как успевают полностью отправится curl. Есть ли возможность дождаться полного завершения curl?
  • Вопрос задан
  • 226 просмотров
Пригласить эксперта
Ответы на вопрос 3
@vshvydky
правильнее не юзать курл, есть fetch, got, axios , request
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
В консоль выводит прогресс, который curl пишет в stderr
в stdout по идее ничего не пишет, у вас же POST
Ответ написан
Комментировать
@XenonDev
попробуйте перевести на промисы
const { exec } = require('child_process');

const cmd = `curl -X POST https://secure.payu.com/api/v2_1/orders -H "Content-Type: application/json" -H "Authorization: Bearer 3e5cac39-7e38-4139-8fd6-30adc06a61bd" -d '{ "notifyUrl": "https://your.eshop.com/notify", "customerIp": "127.0.0.1", "merchantPosId": "145227", "description": "RTV market", "currencyCode": "PLN", "totalAmount": "21000", "buyer": {     "email": "john.doe@example.com",     "phone": "654111654",     "firstName": "John",     "lastName": "Doe",     "language": "pl" }, "products": [     {         "name": "Wireless Mouse for Laptop",         "unitPrice": "15000",         "quantity": "1"     },     {         "name": "HDMI cable",         "unitPrice": "6000",         "quantity": "1"     } ]}'`;

execCommand(cmd)
  .then(({ stdout, stderr }) => console.log(`stdout: ${stdout}\nstderr: ${stderr}`))
  .catch(err => console.error(err)
  .finally(() => console.log('App has been finished'))

function execCommand(cmd) {
    return new Promise(resolve, reject) {
      exec(cmd, (error, stdout, stderr) => error? reject(error) : resolve({ stdout, stderr }));
  };
}

И честно говоря не знаю как узнать успешно выполнился curl или нет, так как stderr будет приходить всегда. Возможно можно смотреть на код возврата процесса...
А вообще Вам правильно написали, надо использовать что-то из либ (requset, axios, fetch...) для отправки запросов. Не хотите внешнюю либу - можно использовать нативную библиотеку http.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы