Используя запрос POST, я отправляю информацию, отправленную пользователем, в API, который предоставляет информацию, специфичную для пользователя.
Теперь я хочу сохранить информацию, полученную запросом POST, как переменную, которую я могу использовать в других функциях/диалогах.
Я пробовал следующее:
Версия кода, которую я сделал, выглядит следующим образом:
var body2;
bot.dialog('FunctionA', [
function (session) {
session.sendTyping();
builder.Prompts.text(session, "Please key-in your App ID:");
},
function (session, results) {
session.userData.AppID= results.response;
var options = {
url: 'APIXYZ.COM',
headers: {
'Content-Type' : 'application/json'
},
body: JSON.stringify({"appID": session.userData.AppID})
};
request.post(options, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.info(body); //logs okay
session.userData.infoA = body;
console.info(session.userData.infoA) //logs okay
body2 = body;
console.info (body2) // logs ok
var bodyvar = body;
console.info (bodyvar) //logs ok
} else {
console.info("Error: " + error);
console.info("Status Code: " + response.statusCode);
}
});
var msg = new builder.Message(session)
.text("The body is:" + session.userData.infoA) //outputs "The body is undefined", if body2,bodyvar -> empty
.suggestedActions(
builder.SuggestedActions.create(
session, [
builder.CardAction.imBack(session, "Ok", "Ok")
builder.CardAction.imBack(session, "No", "No")
]
));
session.send(msg).endDialog();
}]).triggerAction({ matches: /^ABC/i });
Похоже, он работает только внутри блока запроса, и я не могу использовать его вне этого. Он регистрируется как неопределенный при использовании вне его. Я хотел бы иметь возможность хранить тело запроса POST как переменную, чтобы я мог использовать его вне этого диалога, а также сохранить его в базе данных.
Спасибо!
Редактировать:
Я объявил body2 как переменную вне диалогового окна и блока запроса и использовал переменную в том же диалоговом окне сразу после запроса.
var msg = new builder.Message(session)
.text("The body contains: " + body2 + " .")
.suggestedActions(
builder.SuggestedActions.create(
session, [
builder.CardAction.imBack(session, "Ok", "Ok")
builder.CardAction.imBack(session, "No", "No")
]
));
Это выводит The body contains: undefined .
Я также пытался использовать его в другом диалоговом окне:
bot.dialog('Validation', function (session) {
console.info(body2);
session.send("The content is : " + body2 +" xx");
if (body2== "ABC")
{
session.sendTyping();
var msg = new builder.Message(session);
[.......]
Это приводит к подсказке "Oops. Something went wrong and we need to start over"
... под «определенным» я имел в виду «созданный экземпляр».
@mdrichardson Я обновил вопрос, чтобы учесть мои правки и дополнительный код, спасибо!





Проблема в том, что ваш запрос post не выполняется до того, как вы выполните другие функции. Другими словами, вот что делает ваш код:
post запросbody2post запрос завершается, и тогда определяет body2 как bodyВы можете исправить это двумя способами:
Это в основном заставляет весь ваш код ждать, пока request.post вернет данные, прежде чем продолжить. Если вы не знакомы, async/await — это более новый способ использования Promises или .then(). Это СУПЕР полезно, особенно при выполнении HTTP-запросов. Вы можете читать больше здесь.
Добавьте async
async function (session, results) {
session.userData.AppID= results.response;
var options = {
url: 'APIXYZ.COM',
...
Добавьте await
await request.post(options, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.info(body); //logs okay
session.userData.infoA = body;
Поскольку request.post будет выполнять код после того, как у него есть error, response и body, вы можете включить любой код, который должен использовать возвращаемые данные, следующим образом:
request.post(options, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.info(body); //logs okay
body2 = body;
console.info (body2) // logs ok
var msg = new builder.Message(session)
.text("The body is:" + body2)
.suggestedActions(
builder.SuggestedActions.create(
session, [
builder.CardAction.imBack(session, "Ok", "Ok"),
builder.CardAction.imBack(session, "No", "No")
]
));
session.send(msg).endDialog();
} else {
console.info("Error: " + error);
console.info("Status Code: " + response.statusCode);
}
});
Я рекомендую идти по маршруту async/await по двум причинам:
body2 в других диалогах, вам все равно придется использовать его. С помощью описанного выше метода «инкапсуляции» вы все еще можете ожидать ответа, пока запускается другой диалог, который требует body2При всем при этом похоже, что вы используете V3 Bot Framework. Если это новый бот, я рекомендую создать его в V4 — у него новые функции, и мы его лучше поддерживаем.
Вы пытаетесь получить доступ к
body2вне тела запроса? Пока он определен вне его, он должен работать нормально. Я только что проверил что-то очень похожее, и это сработало. Можете ли вы опубликовать весь свой код и указать, где вы хотите снова получить доступ кbody2(или соответствующей переменной)?