В Node, как выполнить sql из подключения к глобальной базе данных - PullRequest
0 голосов
/ 27 января 2019

Я не могу выполнить sql при использовании подключения к глобальной базе данных в node.js.

Я выполнил действия, описанные в документации Azure: https://docs.microsoft.com/en-us/azure/mysql/connect-nodejs и смог отобразить вывод на консоли.Но я хочу поместить все свое соединение с базой данных SQL Azure в отдельный файл, но запрос на выборку не печатает выходные данные на консоли.

DatabaseManager.js

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


var sqlConnection = function sqlConnection() {
// Create connection to database
var config =
  {
    userName: 'uname',
    password: 'password',
    server: 'dbserver.database.windows.net',
    options:
        {
            database: 'mydatabase',
            encrypt: true
        }
  }

var connection = new Connection(config);
// Attempt to connect and execute queries if connection goes through

connection.on('connect', function(err) {
  if (err) 
    {
        console.log(err)
   }

  else 
    {
        console.log('CONNECTED TO DATABASE');
   }

  }
 );
}
module.exports = sqlConnection;

app.js

var restify = require('restify');
var builder = require('botbuilder');
var botbuilder_azure = require("botbuilder-azure");
var azure = require('azure-storage');
var dbconnection = require('./DatabaseManager');

bot.dialog('profileDialog',
    (session) => {
      session.send('You reached the profile intent. You said \'%s\'.', session.message.text);

      console.log('Reading rows from the Table...');
        dbconnection("select FNAME from StudentProfile where ID=1"),
        function (err, result, fields) {
            if (err) throw err;
            console.log(result);
        }
          session.endDialog();   
    }

Вывод на консоль:

Чтение строк из таблицы ...ПОДКЛЮЧЕНО К БАЗЕ ДАННЫХ

Я ожидал вывода FNAME, но на консоли ничего не печатается.Есть что-нибудь, что мне не хватает?

Спасибо.

1 Ответ

0 голосов
/ 27 января 2019

Здесь есть пара проблем. Во-первых, вы должны импортировать модуль только один раз для каждого файла. Это всего лишь вопрос производительности, и он не нарушит ваш код.

Далее обратите внимание на то, что вы экспортируете из модуля DatabaseManager. Прямо сейчас вы экспортируете функцию, которая создает соединение, а затем ничего с ним не делает. Мы можем исправить это, используя шаблон под названием «обратный вызов», который позволяет нам предоставить функцию, которая затем будет вызываться с подключением в качестве аргумента.

Я добавил тонну комментариев к коду, объясняющих вещи. Этот код не будет работать как есть - есть пара мест, где я должен «сделать это или это». Вам придется выбрать один.

var Tedious = require('tedious'); // Only require a library once per file
var Connection = Tedious.Connection;
var Request = Tedious.Request;

// Or using the object spread operator
var { Connection, Request } = require('tedious');

// You called this `sqlConnection`. I'm going to use a verb since it's a
// function and not a variable containing the connection. I'm also going
// to change the declaration syntax to be clearer.

function connect(cb) { // cb is short for callback. It should be a function.
  var config = {
    userName: 'uname',
    password: 'password',
    server: 'dbserver.database.windows.net',
    options: {
      database: 'mydatabase',
      encrypt: true
    }
  }; // Put a semi-colon on your variable assignments

  var connection = new Connection(config);

  // Attempt to connect and execute queries if connection goes through
  connection.on('connect', function(err) {
    if (err) {
      console.log(err);
      return; // Stop executing the function if it failed
    }

    // We don't need an "else" because of the return statement above
    console.log('CONNECTED TO DATABASE');

    // We have a connection, now let's do something with it. Call the
    // callback and pass it the connection.
    cb(connection);
  });
}

module.exports = connect; // This exports a function that creates the connection

Затем вернитесь в свой основной файл, вы можете использовать его следующим образом.

var restify = require('restify');
var builder = require('botbuilder');
var botbuilder_azure = require('botbuilder-azure');
var azure = require('azure-storage');
var connect = require('./DatabaseManager'); // renamed to be a verb since it's a function.

bot.dialog('profileDialog', (session) => { // Hey, this is a callback too!
  session.send('You reached the profile intent. You said \'%s\'.', session.message.text);

  console.log('Creating a connection');

  connect((connection) => {
  // or with the traditional function notation
  connect(function(connection) {

    console.log('Reading rows from the Table...');

    // Execute your queries here using your connection. This code is
    // taken from 
    // https://github.com/tediousjs/tedious/blob/master/examples/minimal.js
    request = new Request("select FNAME from StudentProfile where ID=1", function(err, rowCount) { // Look another callback!
    if (err) {
      console.log(err);
    } else {
      console.log(rowCount + ' rows');
    }
    connection.close();
  });

  request.on('row', function(columns) {  // Iterate through the rows using a callback
    columns.forEach(function(column) {
      if (column.value === null) {
        console.log('NULL');
      } else {
        console.log(column.value);
      }
    });
  });

  connection.execSql(request);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...