-2

Я пытаюсь отправить запрос на URL-адрес с помощью xmlhttprequest и запустить файл js с помощью Node js. но ответ на него приходит как неопределенный. когда я отправляю те же данные с помощью команды CURL, я получаю правильный ответ. Почему он не работает в случае nodejs и xmlhttprequest.почему ответ на команду xmlhttprequest post в узле JS приходит как undefined

Вот код, который я написал. имя файла test.js

'use strict'; 


var readlineSync = require('readline-sync'); 
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 
var urlopen =require("openurl"); 


var clientId = "amzn1.application-oa2-client.775a44579eaf461b92db3d1a4cb23a5a"; 

var deviceId = "Test_device1"; 
var deviceSerialNumber = 123; 
var redirectUri = "https://localhost:9745/authresponse"; 
var responseType ="code"; 

var clientSecret = "29a6520d97d11d640e030786e133ccec9ead67005aaa45c212e72e10b00900ff"; 
promptUserLogin(); 


sleep(10000); 

function sleep(milliseconds) { 
    var start = new Date().getTime(); 
    for (var i = 0; i < 1e7; i++) { 
    if ((new Date().getTime() - start) > milliseconds){ 
     break; 
    } 
    } 
} 


var Urlcode = readlineSync.question('enter the code '); 

var proceed = readlineSync.question('proceed with execution?'); 
if(proceed){ 
    getTokenFromCode(Urlcode); 
} 
function promptUserLogin() { 


    const scope = 'alexa:all'; 
    const scopeData = { 
     [scope]: { 
      productID: deviceId, 
      productInstanceAttributes: { 
      deviceSerialNumber: deviceSerialNumber 
      } 
     } 
     }; 
const authUrl = 'https://www.amazon.com/ap/oa?client_id=' + clientId + '&scope=' + encodeURIComponent(scope) + '&scope_data=' + encodeURIComponent(JSON.stringify(scopeData)) + '&response_type=' + responseType + '&redirect_uri=' + encodeURI(redirectUri); 
     console.log("abhi avs.js promptUserLogin newWindow"); 
     urlopen.open(authUrl); 
    } 


function getTokenFromCode(CODE) { 

    return new Promise((resolve, reject) => { 
     if (typeof CODE !== 'string') { 
     const error = new TypeError('`code` must be a string.'); 
     this._log(error); 
     return reject(error); 
     } 


     const grantType = 'authorization_code'; 
     var postData = 'grant_type=' + grantType + '&code=' + CODE + '&client_id=' + clientId + '&client_secret=' + clientSecret + '&redirect_uri=' + encodeURIComponent(redirectUri); 

     const url = 'https://api.amazon.com/auth/o2/token'; 
     const xhr = new XMLHttpRequest(); 
     xhr.open('POST', url, true); 
     xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8'); 
     xhr.onload = (event) => { 
     let response = xhr.response; 
     response = JSON.parse(xhr.response); 

     const isObject = response instanceof Object; 
     const errorDescription = isObject && response.error_description; 
     if (errorDescription) { 
      const error = new Error(errorDescription); 
      console.log(error); 
      return reject(error); 
     } 
     const token = response.access_token; 
     const refreshToken = response.refresh_token; 
     const tokenType = response.token_type; 
     const expiresIn = response.expiresIn; 

     //this.setToken(token) 
     //this.setRefreshToken(refreshToken) 

     //this.emit(AVS.EventTypes.LOGIN) 
     console.log('abhi avs.js Logged in.'); 
     resolve(response); 
     }; 
    xhr.onerror = (error) => { 
     this._log(error); 
     reject(error); 
     }; 
     xhr.send(postData); 
    }); 
    } 

Я запустил его в терминале с помощью командного узла test.js. как только мы запустим его, он откроет страницу входа в amazon, мы будем перенаправлены на URL с кодом в нем. https://localhost:9745/authresponse?code=ANcUMLaDrkMtCwUSrIqc&scope=alexa%3Aall

Здесь код ANcUMLaDrkMtCwUSrIqc. передайте эту строку как значение и введите 1 для выполнения следующих шагов. то он дал ошибку в

неопределенную ^

SyntaxError: Неожиданный маркер ˙U на Object.parse (родной) в xhr.onload (/home/saiabhi/Avs/avs_test.js:100: 25) at dispatchEvent (/home/saiabhi/Avs/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:591:25) at setState (/home/saiabhi/Avs/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:614: 14) на IncomingMessage. (/home/saiabhi/Avs/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:447:13) at emitNone (events.js: 72: 20) на IncomingMessage.emit (events.js: 166: 7) at endReadableNT (_stream_readable.js: 913: 12) на nextTickCallbackWith2Args (Node.js: 442: 9) на process._tickCallback (node.js: 356: 17)

ссылка ссылка: https://miguelmota.com/blog/alexa-voice-service-authentication/
, когда я побежал используя curl для одинаковых значений, он отлично работал.

curl -X POST --data "grant_type=${GRANT_TYPE}&code=${CODE}&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&redirect_uri=${REDIRECT_URI}" https://api.amazon.com/auth/o2/token 


what am i doing wrong. please let me know. 
+0

Разбейте свой код до наименьшей части, которая воспроизводит проблему. Вероятно, 99% вы сами найдете проблему самостоятельно. – Brad

ответ

1

Код не чист. Я не могу сказать, это работает .. но в первую очередь, я рекомендую Смените

xhr.response 

в

xhr.responseText; 

, когда вы звоните обещание, я всегда рекомендую, чтобы закончить его цепью поймать, потому что вы можете потеряли ошибки

'use strict'; 
 

 
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 
 
var clientId = "amzn1.application-oa2-client.775a44579eaf461b92db3d1a4cb23a5a"; 
 
var deviceId = "Test_device1"; 
 
var deviceSerialNumber = 123; 
 
var redirectUri = "https://localhost:9745/authresponse"; 
 
var Urlcode = "ANcUMLaDrkMtCwUSrIqc"; 
 
var clientSecret = "29a6520d97d11d640e030786e133ccec9ead67005aaa45c212e72e10b00900ff"; 
 

 
getTokenFromCode(Urlcode) 
 
    .then(function(result){ 
 
     console.log(result); 
 
    }) 
 
    .catch(function (error) { 
 
     console.log(error); 
 
    }); 
 

 

 
function getTokenFromCode(CODE) { 
 

 
    return new Promise((resolve, reject) => { 
 
     if (typeof CODE !== 'string') { 
 
      const error = new TypeError('`code` must be a string.'); 
 
      this._log(error); 
 
      return reject(error); 
 
     } 
 

 
     const grantType = 'authorization_code'; 
 
     var postData = 'grant_type=' + grantType + '&code=' + CODE + '&client_id=' + clientId + '&client_secret=' + clientSecret + '&redirect_uri=' + encodeURIComponent(redirectUri); 
 

 
     const url = 'https://api.amazon.com/auth/o2/token'; 
 
     const xhr = new XMLHttpRequest(); 
 
     xhr.open('POST', url, true); 
 
     xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8'); 
 
     xhr.onload =() => { 
 
      let response = xhr.responseText; 
 
      console.log(response); 
 
      response = JSON.parse(response); 
 
      const isObject = response instanceof Object; 
 
      const errorDescription = isObject && response.error_description; 
 
      if (errorDescription) { 
 
       const error = new Error(errorDescription); 
 
       console.log(error); 
 
       return reject(error); 
 
      } 
 
      const token = response.access_token; 
 
      const refreshToken = response.refresh_token; 
 
      const tokenType = response.token_type; 
 
      const expiresIn = response.expiresIn; 
 
      this.setToken(token) 
 
      this.setRefreshToken(refreshToken) 
 

 
      this.emit(AVS.EventTypes.LOGIN) 
 
      resolve(response); 
 
     }; 
 
     xhr.onerror = (error) => { 
 
      this._log(error); 
 
      reject(error); 
 
     }; 
 
     xhr.send(postData); 
 
    }); 
 
}

+0

Я сделал изменения, как и сказал, что нет изменений в результате. он по-прежнему дает такую ​​же ошибку. Можно ли использовать XMLHttpRequest при запуске js fole из терминала с помощью nodejs? – Abhishek

+0

Добавлен весь код, я получаю в ответ «Ошибка: запрос имеет недопустимый параметр гранта: код« –

+0

код, который я поделил, является усохшей версией для лучшего понимания. Вот полный код. – Abhishek