HTTP-запрос Node.js, возвращающий тело / сообщение пуст - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь использовать этот пакет https://www.npmjs.com/package/request для отправки данных POST и ожидания ответа, а затем размещения дополнительных данных. Но я всегда получаю body / msg как неопределенное, и код почему-то не работает.

У меня есть этот код в браузере:

$.ajax("/login",{ /// here i am in https://255.255.255 /// I am obscuring the real host ip

 data:{
   username:"username",
    password: "password",
     autologin:"true"},

 method:"POST"

}).done(function(msg) {
      console.log( msg );
       /// another $.ajax request here
    }); 

Здесь я получаю сообщение как {success: true, redirectTo: "https://255.255.255"} и меня перенаправляют. Это работает.

Но в node.js это не так:

var request = require('request');

request({
    method: "POST",
     baseUrl: "https://255.255.255",
      uri: "/login",
form: { 
      username: "username",
     password: "password",
    autologin: "true"}},
function(body, msg, err){ console.log(body); console.log(msg); })

Тело и сообщение, я получаю оба пустых. console.log(err) вернуть ноль

/login основан на сеансе и поддерживает только application/x-www-form-urlencoded , Кажется, что оба посылают данные одного и того же типа, все идентично. Я не понимаю, что там не так: /

Буду признателен за любую помощь. Заранее спасибо

Редактировать: Поэтому я попытался использовать правильные аргументы обратного вызова и получил эту ошибку: 403 Затем я попытался использовать заголовки для имитации broswer, но я все еще получаю эту ошибку.

headers: {'user-agent': 'Mozilla/5.0'}
headers: {'user-agent': 'node.js'}

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Я думаю, вы запутались в посылке с обещанием и без обещания.Согласно вашему примеру, $ajax возвращает ответ Promiseified, и вы напрямую получаете данные из ответа на запрос ajax.Вы ожидаете, что пакет request также должен предоставлять вам данные напрямую, что неверно.

На самом деле вы можете решить вашу проблему двумя способами:

Sol.1: Используйте правильные аргументы функции обратного вызова, и вы должны получить данные в третьем аргументе функции обратного вызова.Такие как:

var request = require('request');

request({
    method: "POST",
    baseUrl: "https://255.255.255",
    uri: "/login",
    form: {
      username: "username",
      password: "password",
      autologin: "true"
    }
  },
  function (error, httpResponse, body) {
    if (error) {
      console.error(error);
    }
    console.log(httpResponse.statusCode);
    console.log(body);
  });

Sol.2: Используйте пакет request-promise NPM (скачайте его с здесь ) и получите ответ в ответ.Например:

var request = require('request-promise');

const getData = async () => {
  return new Promise((resolve, reject) => {
    const options = {
      method: "POST",
      baseUrl: "https://255.255.255",
      uri: "/login",
      form: {
        username: "username",
        password: "password",
        autologin: "true",
        resolveWithFullResponse: true, // Returns full response. To get only data don't use this property or mark it false.
      }
    };

    // Get whole Response object.
    const response = await request(options);

    // Returns the Promise.Resolve or Reject based on response.
    if (response.statusCode < 200 || response.statusCode > 300) {
      const errorMsg = 'Error occurred while POSTing the request. Got status: ' + response.status;
      console.error(errorMsg);

      // Reject the promise. Should be caught.
      return reject(errorMsg);
    }

    const responseBody = response.body;
    console.log(responseBody);

    // Return the response.
    return resolve(responseBody);
  })
}

Выше реализация вернет обещание для вызываемого метода getData().

ПРИМЕЧАНИЕ: Оператор const response = await request(options); вернет весь объект ответа, если resolveWithFullResponse: true, используется в options объекте JSON.Если вам нужно только тело ответа или данные, не указывайте свойство resolveWithFullResponse в параметрах или присвойте ему значение false.По умолчанию значение resolveWithFullResponse равно false.

0 голосов
/ 02 января 2019

Формат обратного вызова (err, response, body);Может быть, поэтому вы получаете пустое тело и ответ. Подробнее см. Здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...