2017-01-22 1 views
1

полностью новый для Node.js, и эта функция обратного вызова меня заводит.Node.js «callback not defined» при попытке HTTP-запроса

Я пишу Умение для эха Амазонки. В рамках этого я пытаюсь отправить SMS с помощью BulkSMS.com через HTTP-запрос. У http.request есть обратный вызов, который анализирует ответ. (Чтобы вывести API BulkSMS из уравнения в приведенном ниже примере, я просто пытаюсь заставить его работать с помощью HTTP-запроса на Random.org (например, www.random.org/integers/?num=1 & min = 1 & max = 10 & цв = 1 & база = 10 & формата = обычная & RND = новая)

Однако я получаю ошибку о том, что обратный вызов не определен

{ "ErrorMessage":. «обратный вызов не определено ", " errorType ":" ReferenceError ", " stackTrace ": [ " Emergency.e ventHandlers.onLaunch (/var/task/index.js:54:11) ", " AlexaSkill.requestHandlers.LaunchRequest (/var/task/AlexaSkill.js:16:37) ", " AlexaSkill.execute (/ var /task/AlexaSkill.js:97:24)», "exports.handler (/var/task/index.js:100:15)" ] }

Я уверен, что я делаю что-то совершенно глупо и для этого я извиняюсь, но я просто не вижу этого.

Вот обработчик события onLaunch в моем index.js. Любая помощь очень ценится.

Emergency.prototype.eventHandlers.onLaunch = function (launchRequest, session, response) { 
console.log("Emergency onLaunch requestId: " + launchRequest.requestId + ", sessionId: " + session.sessionId); 

console.log("Attempting to send SMS"); 


callback = function(response) { 
    var str = ''; 

    console.log("In callback"); 
    //another chunk of data has been recieved, so append it to `str` 
    response.on('data', function (chunk) { 
     str += chunk; 
     console.log("Getting Data"); 
    }); 

    //the whole response has been recieved, so we just print it out here 
    response.on('end', function() { 
     console.log("End of response"); 
     console.log(str); 
    }); 
} 

http.request(options, callback).end(); 



console.log("Finished sending SMS"); 
var speechOutput = "<speak>SMS sent</speak>"; 
response.tell(speechOutput); 
}; 

Полный индекс index.js находится ниже.

'use strict'; 

/** 
* App ID for the skill 
*/ 
var APP_ID = "amzn1.ask.skill.eb8cf94a-848f-45ae-9792-xxxxxxxxxx"; 

/** 
* The AlexaSkill prototype and helper functions 
*/ 
var AlexaSkill = require('AlexaSkill'); 
var http = require('http'); 
var request = require("request"); 


//var Alexa = require('alexa-sdk'); 

var SKILL_NAME = 'Emergency'; 


var Emergency = function() { 
    AlexaSkill.call(this, APP_ID); 
    console.log("APP_ID set"); 
}; 

var alexaResponse = ""; 


//The url we want is: 'www.random.org/integers/? num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new' 
var options = { 
    host: 'www.random.org', 
    path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new' 
}; 


// Extend AlexaSkill 
Emergency.prototype = Object.create(AlexaSkill.prototype); 
Emergency.prototype.constructor = Emergency; 



Emergency.prototype.eventHandlers.onSessionStarted = function (sessionStartedRequest, session) { 
    console.log("Emergency onSessionStarted requestId: " +  sessionStartedRequest.requestId 
    + ", sessionId: " + session.sessionId); 
    // any initialization logic goes here 
}; 

Emergency.prototype.eventHandlers.onLaunch = function (launchRequest, session, response) { 
    console.log("Emergency onLaunch requestId: " + launchRequest.requestId + ", sessionId: " + session.sessionId); 

    console.log("Attempting to send SMS"); 


    callback = function(response) { 
     var str = ''; 

     console.log("In callback"); 
     //another chunk of data has been recieved, so append it to `str` 
     response.on('data', function (chunk) { 
      str += chunk; 
      console.log("Getting Data"); 
     }); 

     //the whole response has been recieved, so we just print it out here 
     response.on('end', function() { 
      console.log("End of response"); 
      console.log(str); 
     }); 
    } 

    http.request(options, callback).end(); 

    console.log("Finished sending SMS"); 
    var speechOutput = "<speak>SMS sent</speak>"; 
    response.tell(speechOutput); 
}; 

Emergency.prototype.eventHandlers.onSessionEnded = function (sessionEndedRequest, session) { 
    console.log("Emergency onSessionEnded requestId: " +  sessionEndedRequest.requestId 
     + ", sessionId: " + session.sessionId); 
    // any cleanup logic goes here 
}; 

Emergency.prototype.intentHandlers = { 
    // register custom intent handlers 

    EmergencyIntent: function (intent, session, response) { 
    // Get a random "never" phrase from the list 

    } 
}; 


// Create the handler that responds to the Alexa Request. 
exports.handler = function (event, context) { 
// Create an instance of the Emergency skill. 
var emergency = new Emergency();  
emergency.execute(event, context); 
}; 
+0

У вас есть фрагмент кода, похоже, работает нормально. Это полный код? – Sridhar

+0

Спасибо, что посмотрели Шридхар - вот полный код. – pmcmurrough

ответ

0

Однако я получаю ошибку о том, что обратный вызов не определен.

Это из-за 'use strict'; режима.

Во-первых, строгий режим делает невозможным случайное создание глобальных переменных. При нормальном ошибочном JavaScript переменная в присваивании создает новое свойство на глобальном объекте и продолжает «работать» (хотя возможен и будущий сбой: вероятно, в современном JavaScript).Задания, которые бы случайно создать глобальные переменные, а не бросать в строгом режиме:

Более подробно об этом в MDN

accidentalGlobalVariable = 'hello world'; 
console.log(accidentalGlobalVariable); // logs hello world 

В строгом режиме

'use strict'; 
accidentalGlobalVariable = 'hello world'; 
console.log(accidentalGlobalVariable); // errors out 

Ошибка

accidentalGlobalVariable = 'hello world'; 
         ^
ReferenceError: accidentalGlobalVariable is not defined 

В вашем примере кода, если я бегу без строгого режима он работает,

var http = require('http'); 

var options = { 
    host: 'www.random.org', 
    path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new' 
}; 

callback = function (response) { 
    console.log('response statusCode', response.statusCode); 
}; 

http.request(options, callback).end(); 

но если я бегу со строгим режимом,

'use strict'; 

var http = require('http'); 

var options = { 
    host: 'www.random.org', 
    path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new' 
}; 

callback = function (response) { 
    console.log('response statusCode', response.statusCode); 
}; 

http.request(options, callback).end(); 

Я тоже получаю ошибку, потому что строгие ошибки режима из callback

callback = function (response) { 
     ^
ReferenceError: callback is not defined 

вы можете исправить его

Использование var или let в назначении.

var callback = function (response) { 
    console.log('response statusCode', response.statusCode); 
}; 

Устранение необходимости callback все вместе и использовать анонимную функцию вместо этого.

http.request(options, function (response) { 
    console.log('response statusCode', response.statusCode); 
}).end(); 
+1

Спасибо, Шридхар, ты спас меня от вытаскивания моих маленьких волос. – pmcmurrough

+0

Пробовал ваши предложения Шридхар, не получая проблему с «обратным вызовом», но по-прежнему не может заставить http-запрос работать с использованием обратного вызова или анонимного функционального подхода. В любом случае я получаю журналы до и после HTTP-запроса, но ничего не записывается из анонимной функции. – pmcmurrough

+0

Этот код, кажется, работает нормально, выполнив код ответа. Итак, в вашем случае это не вход в анонимную функцию? Странный. Можете ли вы обновить вопрос с помощью нового кода? – Sridhar