Javascript 在节点中,如何从全局数据库连接执行sql

Javascript 在节点中,如何从全局数据库连接执行sql,javascript,node.js,azure-sql-database,node-modules,Javascript,Node.js,Azure Sql Database,Node Modules,在node.js中使用全局数据库连接时,我无法执行sql 我遵循了Azure文档中的步骤:并且能够在控制台上显示输出。但是,我想将我的所有Azure SQL数据库连接放在一个单独的文件中,但是select查询没有在控制台上打印输出 DatabaseManager.js var Connection=require('tedous')。连接; var Request=require(‘冗长’)。Request; var sqlConnection=函数sqlConnection(){ //创建到

在node.js中使用全局数据库连接时,我无法执行sql

我遵循了Azure文档中的步骤:并且能够在控制台上显示输出。但是,我想将我的所有Azure SQL数据库连接放在一个单独的文件中,但是select查询没有在控制台上打印输出

DatabaseManager.js

var Connection=require('tedous')。连接;
var Request=require(‘冗长’)。Request;
var sqlConnection=函数sqlConnection(){
//创建到数据库的连接
变量配置=
{
用户名:“uname”,
密码:“password”,
服务器:'dbserver.database.windows.net',
选项:
{
数据库:“mydatabase”,
加密:真
}
}
var连接=新连接(配置);
//如果连接通过,尝试连接并执行查询
connection.on('connect',函数(err){
如果(错误)
{
console.log(错误)
}
其他的
{
log('连接到数据库');
}
}
);
}

module.exports=sqlConnection这里有几个问题。首先,每个文件只能导入一次模块。这只是性能方面的考虑,实际上不会破坏代码

接下来,注意从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);
});

你为什么这么想?您在任何时候都不会真正执行SQL语句。@James,也许我这样做是错的。这是我的第一个js代码。我还尝试了类似dbconnection.query()的方法,但显示的方法无效。请给出一个例子,使用上面app.js中的连接执行查询?感谢3ocene,缺少一行执行sql的代码。出于某种原因,我需要再次在app.js中包含那些乏味的东西。否则,我将收到,请求未定义。感谢您编辑我错过的行!是的,这是正确的。导入某些内容时,它仅在该文件中可用,而不在包含它的任何文件中可用。如果A导入B导入C,A可以访问B,B可以访问C,但A不能访问C。
const
/
let
over
var
,承诺超过回调,并提供等效代码作为选项,这只会混淆示例,在适当的情况下,箭头函数超过STD函数。@James,不知道Node OP正在运行的是哪个版本,我不想做任何会导致示例中断的事情。但是,我确实希望劝阻任何人在不阅读代码的情况下复制粘贴代码。如果有我不知道的堆栈溢出样式指南,我很乐意遵守。