Подключите Node.js BOT к базе данных MS Azure SQL

У меня есть рабочий бот MS Teams, написанный на Node.js. Бот задает серию вопросов и в настоящее время отображает ответы в конце, обращаясь к переменным сеанса. Все хорошо.

Теперь я пытаюсь сохранить переменные сеанса в базе данных MS Azure SQL. БД правильно настроена в Azure, так как я могу получать доступ к ней и записывать в нее данные в SSMS. Но я считаю, что я, вероятно, неправильно подключаюсь к БД в моем коде бота. Код бота, который я использую, взят из:

подключение к SQL с помощью Node.js

Для меня этот код имеет смысл. Но как мне использовать этот код в моем боте? Вот что я пытался до сих пор ...

В настоящее время я использую локальную память MemoryBotStorage () и устанавливаю ее.

var inMemoryStorage = new builder.MemoryBotStorage();
.set('storage', inMemoryStorage)

В другой статье Microsoft , касающийся Azure Cosmos DB, говорится: «4.Укажите, что вы хотите использовать свою настраиваемую базу данных вместо хранилища в памяти». Итак, из этого я делаю вывод, что мне нужно добавить свой экземпляр sql db в .set ('storage', DB Goes Here), но мои попытки потерпели неудачу, и я не уверен, прав ли я?

Итак, мой вопрос: как мне правильно получить доступ к базе данных SQL-сервера Azure из моего кода бота - и является ли ссылка, которую я предоставил, правильной?

Спасибо

Примечание. Этот код образец сработало для меня - я смог подключиться и запросить мою базу данных Azure, но это всего лишь код базы данных и не учитывает код бота.

РЕДАКТИРОВАТЬ - Код:

const builder = require('botbuilder');
const builderTeams = require('botbuilder-teams');
const restify = require('restify');

const connector = new builderTeams.TeamsChatConnector(
    {

        appId: "My app ID,
        appPassword: "My App PW",
    }

);

var inMemoryStorage = new builder.MemoryBotStorage();


const bot = new builder.UniversalBot(connector, [
    function (session) {
    session.send("Welcome.");
    builder.Prompts.text(session, "Question1?");
},
function (session, results) {
    session.dialogData.question1 = results.response;
    builder.Prompts.text(session, "Question2?");
},
function (session, results) {
    session.dialogData.Question2 = results.response;
    builder.Prompts.text(session, "Question3?");
},
function (session, results) {
    session.dialogData.Question3 = results.response;

    // Begin DB

    var Connection = require('tedious').Connection;
    var config = {
        userName: 'myusername',
        password: 'mypw',
        server: 'myserver.database.windows.net',
        // If you are on Azure SQL Database, you need these next options.  
        options: { encrypt: true, database: 'mydb' }
    };
    var connection = new Connection(config);
    connection.on('connect', function (err) {
        // If no error, then good to proceed.  
        console.log("Connected");
        executeStatement1();
    });

    var Request = require('tedious').Request
    var TYPES = require('tedious').TYPES;

    function executeStatement1() {
        request = new Request("INSERT my (Username, Question1, Question2, Question3, StatusDate) VALUES (@Username, @Question1, @Question2, @Question3, CURRENT_TIMESTAMP);", function (err) {
            if (err) {
                console.log(err);
            }
        });
        request.addParameter('Username', TYPES.NVarChar, session.userData.userName);
        request.addParameter('Question1', TYPES.NVarChar, session.dialogData.Question1);
        request.addParameter('Question2', TYPES.NVarChar, session.dialogData.Question2);
        request.addParameter('Question3', TYPES.NVarChar, session.dialogData.Question3);
        request.on('row', function (columns) {
            columns.forEach(function (column) {
                if (column.value === null) {
                    console.log('NULL');
                } else {
                    console.log("ID of inserted item is " + column.value);
                }
            });
        });
        connection.execSql(request);

    // End DB


    // Process request and display details
    session.endDialog();
}
]).set('storage', inMemoryStorage)


const server = restify.createServer();
server.post('api/messages', connector.listen());
server.listen(portnumber)

Ошибка при запуске с npm start:

npm start

> [email protected] start C:\Developer\dailyStatus
> node index.js

C:\Developer\dailyStatus\index.js:81
]).set('storage', inMemoryStorage)
^

SyntaxError: Unexpected token ]
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:616:28)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:188:16)
at bootstrap_node.js:609:3
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: `node index.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely...    

npm ERR! A complete log of this run can be found in:
npm ERR!     C: etc.

ЗАВЕРШЕНИЕ

Мне удалось заставить это работать с этим руководство. Также спасибо Марку ЛеФлеру.


person beginAgain    schedule 03.05.2018    source источник
comment
Вы не упоминаете, что получаете за результат. Есть ошибка? Где это у вас не получается?   -  person Marc LaFleur    schedule 03.05.2018
comment
Хороший момент - добавляем сейчас ...   -  person beginAgain    schedule 03.05.2018


Ответы (1)


У вас несколько опечаток. Например, вам не хватает закрывающего " на appId:

const connector = new builderTeams.TeamsChatConnector(
    {    
        appId: "My app ID",
        appPassword: "My App PW",
    }

);

Вы также не можете объявить функцию function executeStatement1() {...} внутри вашей IDialogWaterfallStep функции. Он должен находиться вне конструктора и вызываться из IDialogWaterfallStep.

person Marc LaFleur    schedule 03.05.2018
comment
Спасибо - я проверю это. Я должен упомянуть, что из-за опечаток я продезинфицировал код, чтобы удалить личную информацию, такую ​​как пароли и т. Д. Я просто сделал это в Notepad ++ в спешке. - person beginAgain; 03.05.2018
comment
Мне не удалось заставить это работать с кодом из моей 1-й ссылки. Вторая ссылка работает вместе с вашим комментарием о том, что функция находится вне конструктора. Причина, по которой я сделал это, - я думаю, что запуталась в том, как работают диалоги. Кажется, что все переходит к следующему оператору, поэтому я подумал, что, возможно, так будет и с кодом БД. Как я уже сказал, он работает, но IDK, как передать переменные сеанса в функцию SQL. Я спрошу об этом в другом посте. TYVM - person beginAgain; 04.05.2018