Alexa SDK V2 High low 游戏无法像教程中所说的那样工作
Alexa SDK V2 High low game not working as it says in tutorial
我正在尝试按照 alexa sdk v2 的高低游戏教程进行操作,但即使按照教程进行操作,我也会遇到错误。
link 到教程:
https://github.com/alexa/skill-sample-nodejs-highlowgame/blob/master/instructions/cli.md
这是index.js中的代码:
const Alexa = require('ask-sdk');
const ddbAdapter = require('ask-sdk-dynamodb-persistence-adapter'); // included in ask-sdk
// TODO: The items below this comment need your attention.
const SKILL_NAME = 'High Low Game';
const ddbTableName = 'High-Low-Game';
const FALLBACK_MESSAGE_DURING_GAME = `The ${SKILL_NAME} skill can't help you with that. Try guessing a number between 0 and 100. `;
const FALLBACK_REPROMPT_DURING_GAME = 'Please guess a number between 0 and 100.';
const FALLBACK_MESSAGE_OUTSIDE_GAME = `The ${SKILL_NAME} skill can't help you with that. It will come up with a number between 0 and 100 and you try to guess it by saying a number in that range. Would you like to play?`;
const FALLBACK_REPROMPT_OUTSIDE_GAME = 'Say yes to start the game or no to quit.';
const LaunchRequest = {
canHandle(handlerInput) {
// launch requests as well as any new session, as games are not saved in progress, which makes
// no one shots a reasonable idea except for help, and the welcome message provides some help.
return handlerInput.requestEnvelope.session.new || handlerInput.requestEnvelope.request.type === 'LaunchRequest';
},
async handle(handlerInput) {
const attributesManager = handlerInput.attributesManager;
const responseBuilder = handlerInput.responseBuilder;
const attributes = await attributesManager.getPersistentAttributes() || {};
if (Object.keys(attributes).length === 0) {
attributes.endedSessionCount = 0;
attributes.gamesPlayed = 0;
attributes.gameState = 'ENDED';
}
attributesManager.setSessionAttributes(attributes);
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
const gamesPlayed = attributes.gamesPlayed.toString()
const speechOutput = requestAttributes.t('LAUNCH_MESSAGE', gamesPlayed);
const reprompt = requestAttributes.t('LAUNCH_REPROMPT');
return responseBuilder
.speak(speechOutput)
.reprompt(reprompt)
.getResponse();
},
};
const ExitHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest'
&& (request.intent.name === 'AMAZON.CancelIntent'
|| request.intent.name === 'AMAZON.StopIntent');
},
handle(handlerInput) {
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('EXIT_MESSAGE'))
.getResponse();
},
};
const SessionEndedRequest = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'SessionEndedRequest';
},
handle(handlerInput) {
console.log(`Session ended with reason: ${handlerInput.requestEnvelope.request.reason}`);
return handlerInput.responseBuilder.getResponse();
},
};
const HelpIntent = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' && request.intent.name === 'AMAZON.HelpIntent';
},
handle(handlerInput) {
const speechOutput = 'I am thinking of a number between zero and one hundred, try to guess it and I will tell you' +
' if it is higher or lower.';
const reprompt = 'Try saying a number.';
return handlerInput.responseBuilder
.speak(speechOutput)
.reprompt(reprompt)
.getResponse();
},
};
const YesIntent = {
canHandle(handlerInput) {
// only start a new game if yes is said when not playing a game.
let isCurrentlyPlaying = false;
const request = handlerInput.requestEnvelope.request;
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
if (sessionAttributes.gameState &&
sessionAttributes.gameState === 'STARTED') {
isCurrentlyPlaying = true;
}
return !isCurrentlyPlaying && request.type === 'IntentRequest' && request.intent.name === 'AMAZON.YesIntent';
},
handle(handlerInput) {
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
sessionAttributes.gameState = 'STARTED';
sessionAttributes.guessNumber = Math.floor(Math.random() * 101);
return handlerInput.responseBuilder
.speak(requestAttributes.t('YES_MESSAGE'))
.reprompt(requestAttributes.t('HELP_REPROMPT'))
.getResponse();
},
};
const NoIntent = {
canHandle(handlerInput) {
// only treat no as an exit when outside a game
let isCurrentlyPlaying = false;
const request = handlerInput.requestEnvelope.request;
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
if (sessionAttributes.gameState &&
sessionAttributes.gameState === 'STARTED') {
isCurrentlyPlaying = true;
}
return !isCurrentlyPlaying && request.type === 'IntentRequest' && request.intent.name === 'AMAZON.NoIntent';
},
async handle(handlerInput) {
const attributesManager = handlerInput.attributesManager;
const responseBuilder = handlerInput.responseBuilder;
const sessionAttributes = attributesManager.getSessionAttributes();
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
sessionAttributes.endedSessionCount += 1;
sessionAttributes.gameState = 'ENDED';
attributesManager.setPersistentAttributes(sessionAttributes);
await attributesManager.savePersistentAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('STOP_MESSAGE'))
.getResponse();
},
};
const UnhandledIntent = {
canHandle() {
return true;
},
handle(handlerInput) {
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('UNHANDLED_RESPONSE'))
.reprompt(requestAttributes.t('UNHANDLED_RESPONSE'))
.getResponse();
},
};
const NumberGuessIntent = {
canHandle(handlerInput) {
// handle numbers only during a game
let isCurrentlyPlaying = false;
const request = handlerInput.requestEnvelope.request;
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
if (sessionAttributes.gameState &&
sessionAttributes.gameState === 'STARTED') {
isCurrentlyPlaying = true;
}
return isCurrentlyPlaying && request.type === 'IntentRequest' && request.intent.name === 'NumberGuessIntent';
},
async handle(handlerInput) {
const { requestEnvelope, attributesManager, responseBuilder } = handlerInput;
const guessNum = parseInt(requestEnvelope.request.intent.slots.number.value, 10);
const sessionAttributes = attributesManager.getSessionAttributes();
const targetNum = sessionAttributes.guessNumber;
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
if (guessNum > targetNum) {
return handlerInput.responseBuilder
.speak(requestAttributes.t('TOO_HIGH_MESSAGE', guessNum.toString()))
.reprompt(requestAttributes.t('TOO_HIGH_REPROMPT'))
.getResponse();
} else if (guessNum < targetNum) {
return handlerInput.responseBuilder
.speak(requestAttributes.t('TOO_LOW_MESSAGE', guessNum.toString()))
.reprompt(requestAttributes.t('TOO_LOW_REPROMPT'))
.getResponse();
} else if (guessNum === targetNum) {
sessionAttributes.gamesPlayed += 1;
sessionAttributes.gameState = 'ENDED';
attributesManager.setPersistentAttributes(sessionAttributes);
await attributesManager.savePersistentAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('GUESS_CORRECT_MESSAGE', guessNum.toString()))
.reprompt(requestAttributes.t('GUESS_CORRECT_REPROMPT'))
.getResponse();
}
return handlerInput.responseBuilder
.speak(requestAttributes.t('FALLBACK_MESSAGE_DURING_GAME'))
.reprompt(requestAttributes.t('FALLBACK_REPROMPT_DURING_GAME'))
.getResponse();
},
};
const ErrorHandler = {
canHandle() {
return true;
},
handle(handlerInput, error) {
console.log(`Error handled: ${error.message}`);
console.log(`Error stack: ${error.stack}`);
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('ERROR_MESSAGE'))
.reprompt(requestAttributes.t('ERROR_MESSAGE'))
.getResponse();
},
};
const FallbackHandler = {
canHandle(handlerInput) {
// handle fallback intent, yes and no when playing a game
// for yes and no, will only get here if and not caught by the normal intent handler
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' &&
(request.intent.name === 'AMAZON.FallbackIntent' ||
request.intent.name === 'AMAZON.YesIntent' ||
request.intent.name === 'AMAZON.NoIntent');
},
handle(handlerInput) {
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
if (sessionAttributes.gameState &&
sessionAttributes.gameState === 'STARTED') {
// currently playing
return handlerInput.responseBuilder
.speak(requestAttributes.t('FALLBACK_MESSAGE_DURING_GAME'))
.reprompt(requestAttributes.t('FALLBACK_REPROMPT_DURING_GAME'))
.getResponse();
}
// not playing
return handlerInput.responseBuilder
.speak(requestAttributes.t('FALLBACK_MESSAGE_OUTSIDE_GAME'))
.reprompt(requestAttributes.t('FALLBACK_REPROMPT_OUTSIDE_GAME'))
.getResponse();
},
};
const LocalizationInterceptor = {
process(handlerInput) {
const localizationClient = i18n.use(sprintf).init({
lng: handlerInput.requestEnvelope.request.locale,
resources: languageStrings,
});
localizationClient.localize = function localize() {
const args = arguments;
const values = [];
for (let i = 1; i < args.length; i += 1) {
values.push(args[i]);
}
const value = i18n.t(args[0], {
returnObjects: true,
postProcess: 'sprintf',
sprintf: values,
});
if (Array.isArray(value)) {
return value[Math.floor(Math.random() * value.length)];
}
return value;
};
const attributes = handlerInput.attributesManager.getRequestAttributes();
attributes.t = function translate(...args) {
return localizationClient.localize(...args);
};
},
};
function getPersistenceAdapter(tableName) {
// Determines persistence adapter to be used based on environment
// Note: tableName is only used for DynamoDB Persistence Adapter
if (process.env.S3_PERSISTENCE_BUCKET) {
// in Alexa Hosted Environment
// eslint-disable-next-line global-require
const s3Adapter = require('ask-sdk-s3-persistence-adapter');
return new s3Adapter.S3PersistenceAdapter({
bucketName: process.env.S3_PERSISTENCE_BUCKET,
});
}
// Not in Alexa Hosted Environment
return new ddbAdapter.DynamoDbPersistenceAdapter({
tableName: tableName,
createTable: true,
});
}
const skillBuilder = Alexa.SkillBuilders.custom();
exports.handler = skillBuilder
.withPersistenceAdapter(getPersistenceAdapter(ddbTableName))
.addRequestHandlers(
LaunchRequest,
ExitHandler,
SessionEndedRequest,
HelpIntent,
YesIntent,
NoIntent,
NumberGuessIntent,
FallbackHandler,
UnhandledIntent,
)
.addRequestInterceptors(LocalizationInterceptor)
.addErrorHandlers(ErrorHandler)
.lambda();
这与下载存储库时所说的完全一样,DynamoDB 的设置也与他们所说的完全一样,但仍然出现错误。当我尝试测试它时,结果是 "There was a problem with the requested skill's response"。
我在 cloudWatch 管理控制台中遇到的错误以及教程中的一些错误是:
我是 Alexa SDK 的新手,在 V1 和 V2 之间来回切换真的很困惑。
如果有人知道可能不是上述 link 的好的教程,我们将不胜感激。
如果有什么我可以帮忙的,请尽管问。谢谢
此示例已损坏,因为它无法在 index.js 中添加对 i18n 的要求,它没有将 i18next 定义为 package.json 中的依赖项,也没有对 languageStrings 进行要求。
将此添加到 index.js 的开头:
const i18n = require('i18next');
const sprintf = require('i18next-sprintf-postprocessor');
const languageStrings = {
'en' : require('./languages/en')
}
这对您的 package.json 中的依赖项:
"i18next": "^10.5.0",
"i18next-sprintf-postprocessor": "^0.2.2"
然后再次部署后端。
我正在尝试按照 alexa sdk v2 的高低游戏教程进行操作,但即使按照教程进行操作,我也会遇到错误。
link 到教程: https://github.com/alexa/skill-sample-nodejs-highlowgame/blob/master/instructions/cli.md
这是index.js中的代码:
const Alexa = require('ask-sdk');
const ddbAdapter = require('ask-sdk-dynamodb-persistence-adapter'); // included in ask-sdk
// TODO: The items below this comment need your attention.
const SKILL_NAME = 'High Low Game';
const ddbTableName = 'High-Low-Game';
const FALLBACK_MESSAGE_DURING_GAME = `The ${SKILL_NAME} skill can't help you with that. Try guessing a number between 0 and 100. `;
const FALLBACK_REPROMPT_DURING_GAME = 'Please guess a number between 0 and 100.';
const FALLBACK_MESSAGE_OUTSIDE_GAME = `The ${SKILL_NAME} skill can't help you with that. It will come up with a number between 0 and 100 and you try to guess it by saying a number in that range. Would you like to play?`;
const FALLBACK_REPROMPT_OUTSIDE_GAME = 'Say yes to start the game or no to quit.';
const LaunchRequest = {
canHandle(handlerInput) {
// launch requests as well as any new session, as games are not saved in progress, which makes
// no one shots a reasonable idea except for help, and the welcome message provides some help.
return handlerInput.requestEnvelope.session.new || handlerInput.requestEnvelope.request.type === 'LaunchRequest';
},
async handle(handlerInput) {
const attributesManager = handlerInput.attributesManager;
const responseBuilder = handlerInput.responseBuilder;
const attributes = await attributesManager.getPersistentAttributes() || {};
if (Object.keys(attributes).length === 0) {
attributes.endedSessionCount = 0;
attributes.gamesPlayed = 0;
attributes.gameState = 'ENDED';
}
attributesManager.setSessionAttributes(attributes);
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
const gamesPlayed = attributes.gamesPlayed.toString()
const speechOutput = requestAttributes.t('LAUNCH_MESSAGE', gamesPlayed);
const reprompt = requestAttributes.t('LAUNCH_REPROMPT');
return responseBuilder
.speak(speechOutput)
.reprompt(reprompt)
.getResponse();
},
};
const ExitHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest'
&& (request.intent.name === 'AMAZON.CancelIntent'
|| request.intent.name === 'AMAZON.StopIntent');
},
handle(handlerInput) {
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('EXIT_MESSAGE'))
.getResponse();
},
};
const SessionEndedRequest = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'SessionEndedRequest';
},
handle(handlerInput) {
console.log(`Session ended with reason: ${handlerInput.requestEnvelope.request.reason}`);
return handlerInput.responseBuilder.getResponse();
},
};
const HelpIntent = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' && request.intent.name === 'AMAZON.HelpIntent';
},
handle(handlerInput) {
const speechOutput = 'I am thinking of a number between zero and one hundred, try to guess it and I will tell you' +
' if it is higher or lower.';
const reprompt = 'Try saying a number.';
return handlerInput.responseBuilder
.speak(speechOutput)
.reprompt(reprompt)
.getResponse();
},
};
const YesIntent = {
canHandle(handlerInput) {
// only start a new game if yes is said when not playing a game.
let isCurrentlyPlaying = false;
const request = handlerInput.requestEnvelope.request;
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
if (sessionAttributes.gameState &&
sessionAttributes.gameState === 'STARTED') {
isCurrentlyPlaying = true;
}
return !isCurrentlyPlaying && request.type === 'IntentRequest' && request.intent.name === 'AMAZON.YesIntent';
},
handle(handlerInput) {
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
sessionAttributes.gameState = 'STARTED';
sessionAttributes.guessNumber = Math.floor(Math.random() * 101);
return handlerInput.responseBuilder
.speak(requestAttributes.t('YES_MESSAGE'))
.reprompt(requestAttributes.t('HELP_REPROMPT'))
.getResponse();
},
};
const NoIntent = {
canHandle(handlerInput) {
// only treat no as an exit when outside a game
let isCurrentlyPlaying = false;
const request = handlerInput.requestEnvelope.request;
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
if (sessionAttributes.gameState &&
sessionAttributes.gameState === 'STARTED') {
isCurrentlyPlaying = true;
}
return !isCurrentlyPlaying && request.type === 'IntentRequest' && request.intent.name === 'AMAZON.NoIntent';
},
async handle(handlerInput) {
const attributesManager = handlerInput.attributesManager;
const responseBuilder = handlerInput.responseBuilder;
const sessionAttributes = attributesManager.getSessionAttributes();
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
sessionAttributes.endedSessionCount += 1;
sessionAttributes.gameState = 'ENDED';
attributesManager.setPersistentAttributes(sessionAttributes);
await attributesManager.savePersistentAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('STOP_MESSAGE'))
.getResponse();
},
};
const UnhandledIntent = {
canHandle() {
return true;
},
handle(handlerInput) {
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('UNHANDLED_RESPONSE'))
.reprompt(requestAttributes.t('UNHANDLED_RESPONSE'))
.getResponse();
},
};
const NumberGuessIntent = {
canHandle(handlerInput) {
// handle numbers only during a game
let isCurrentlyPlaying = false;
const request = handlerInput.requestEnvelope.request;
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
if (sessionAttributes.gameState &&
sessionAttributes.gameState === 'STARTED') {
isCurrentlyPlaying = true;
}
return isCurrentlyPlaying && request.type === 'IntentRequest' && request.intent.name === 'NumberGuessIntent';
},
async handle(handlerInput) {
const { requestEnvelope, attributesManager, responseBuilder } = handlerInput;
const guessNum = parseInt(requestEnvelope.request.intent.slots.number.value, 10);
const sessionAttributes = attributesManager.getSessionAttributes();
const targetNum = sessionAttributes.guessNumber;
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
if (guessNum > targetNum) {
return handlerInput.responseBuilder
.speak(requestAttributes.t('TOO_HIGH_MESSAGE', guessNum.toString()))
.reprompt(requestAttributes.t('TOO_HIGH_REPROMPT'))
.getResponse();
} else if (guessNum < targetNum) {
return handlerInput.responseBuilder
.speak(requestAttributes.t('TOO_LOW_MESSAGE', guessNum.toString()))
.reprompt(requestAttributes.t('TOO_LOW_REPROMPT'))
.getResponse();
} else if (guessNum === targetNum) {
sessionAttributes.gamesPlayed += 1;
sessionAttributes.gameState = 'ENDED';
attributesManager.setPersistentAttributes(sessionAttributes);
await attributesManager.savePersistentAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('GUESS_CORRECT_MESSAGE', guessNum.toString()))
.reprompt(requestAttributes.t('GUESS_CORRECT_REPROMPT'))
.getResponse();
}
return handlerInput.responseBuilder
.speak(requestAttributes.t('FALLBACK_MESSAGE_DURING_GAME'))
.reprompt(requestAttributes.t('FALLBACK_REPROMPT_DURING_GAME'))
.getResponse();
},
};
const ErrorHandler = {
canHandle() {
return true;
},
handle(handlerInput, error) {
console.log(`Error handled: ${error.message}`);
console.log(`Error stack: ${error.stack}`);
const requestAttributes = handlerInput.attributesManager.getRequestAttributes();
return handlerInput.responseBuilder
.speak(requestAttributes.t('ERROR_MESSAGE'))
.reprompt(requestAttributes.t('ERROR_MESSAGE'))
.getResponse();
},
};
const FallbackHandler = {
canHandle(handlerInput) {
// handle fallback intent, yes and no when playing a game
// for yes and no, will only get here if and not caught by the normal intent handler
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' &&
(request.intent.name === 'AMAZON.FallbackIntent' ||
request.intent.name === 'AMAZON.YesIntent' ||
request.intent.name === 'AMAZON.NoIntent');
},
handle(handlerInput) {
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
if (sessionAttributes.gameState &&
sessionAttributes.gameState === 'STARTED') {
// currently playing
return handlerInput.responseBuilder
.speak(requestAttributes.t('FALLBACK_MESSAGE_DURING_GAME'))
.reprompt(requestAttributes.t('FALLBACK_REPROMPT_DURING_GAME'))
.getResponse();
}
// not playing
return handlerInput.responseBuilder
.speak(requestAttributes.t('FALLBACK_MESSAGE_OUTSIDE_GAME'))
.reprompt(requestAttributes.t('FALLBACK_REPROMPT_OUTSIDE_GAME'))
.getResponse();
},
};
const LocalizationInterceptor = {
process(handlerInput) {
const localizationClient = i18n.use(sprintf).init({
lng: handlerInput.requestEnvelope.request.locale,
resources: languageStrings,
});
localizationClient.localize = function localize() {
const args = arguments;
const values = [];
for (let i = 1; i < args.length; i += 1) {
values.push(args[i]);
}
const value = i18n.t(args[0], {
returnObjects: true,
postProcess: 'sprintf',
sprintf: values,
});
if (Array.isArray(value)) {
return value[Math.floor(Math.random() * value.length)];
}
return value;
};
const attributes = handlerInput.attributesManager.getRequestAttributes();
attributes.t = function translate(...args) {
return localizationClient.localize(...args);
};
},
};
function getPersistenceAdapter(tableName) {
// Determines persistence adapter to be used based on environment
// Note: tableName is only used for DynamoDB Persistence Adapter
if (process.env.S3_PERSISTENCE_BUCKET) {
// in Alexa Hosted Environment
// eslint-disable-next-line global-require
const s3Adapter = require('ask-sdk-s3-persistence-adapter');
return new s3Adapter.S3PersistenceAdapter({
bucketName: process.env.S3_PERSISTENCE_BUCKET,
});
}
// Not in Alexa Hosted Environment
return new ddbAdapter.DynamoDbPersistenceAdapter({
tableName: tableName,
createTable: true,
});
}
const skillBuilder = Alexa.SkillBuilders.custom();
exports.handler = skillBuilder
.withPersistenceAdapter(getPersistenceAdapter(ddbTableName))
.addRequestHandlers(
LaunchRequest,
ExitHandler,
SessionEndedRequest,
HelpIntent,
YesIntent,
NoIntent,
NumberGuessIntent,
FallbackHandler,
UnhandledIntent,
)
.addRequestInterceptors(LocalizationInterceptor)
.addErrorHandlers(ErrorHandler)
.lambda();
这与下载存储库时所说的完全一样,DynamoDB 的设置也与他们所说的完全一样,但仍然出现错误。当我尝试测试它时,结果是 "There was a problem with the requested skill's response"。
我在 cloudWatch 管理控制台中遇到的错误以及教程中的一些错误是:
我是 Alexa SDK 的新手,在 V1 和 V2 之间来回切换真的很困惑。 如果有人知道可能不是上述 link 的好的教程,我们将不胜感激。
如果有什么我可以帮忙的,请尽管问。谢谢
此示例已损坏,因为它无法在 index.js 中添加对 i18n 的要求,它没有将 i18next 定义为 package.json 中的依赖项,也没有对 languageStrings 进行要求。 将此添加到 index.js 的开头:
const i18n = require('i18next');
const sprintf = require('i18next-sprintf-postprocessor');
const languageStrings = {
'en' : require('./languages/en')
}
这对您的 package.json 中的依赖项:
"i18next": "^10.5.0",
"i18next-sprintf-postprocessor": "^0.2.2"
然后再次部署后端。