2

我有一个在本地机器上运行 Ubuntu 的虚拟机。我已经安装了 nodejs 以及繁琐的 mssql 驱动程序。我正在尝试从查询中从远程 mssql 服务器中提取数据并返回 json。

我已经阅读了相当多的文档,我想回答的第一个问题是您是否必须在 Windows 机器上运行 Nodejs 才能连接到 mssql 服务器?

(我的印象是使用标准 nodejs windows 驱动程序时就是这种情况。)

第二个问题我已经完成了我的所有流程并且节点服务器运行良好,但是当我进行 mssql 调用时,我收到以下错误:

Invalid state; requests can only be made in the LoggedIn state, not the SentLogin7WithStandardLogin state

我没有发现其他任何人遇到与我相同的情况遇到此错误。我已尝试按照此修复程序中的建议发送带有对象形成的请求。

如何从 NodeJS/Tedious 连接到 SQL Azure?

我仍然遇到与前面提到的相同的错误。所以这里是代码。我正在使用restify,希望只是为我的nodejs服务器制作一个restful api,并从我的mssql调用中吐回json。

var restify = require('restify');
var Connection = require('tedious').Connection;
var server = restify.createServer();

server.listen(8080,function(){
  console.log('%s listening at %s',server.name,server.url);
  server.get('/GetInfo',GetInfo);
});

function GetInfo(req, res, next){

  console.log('Starting GetInfo function ...');
  res.header('Content-Type:application/json');

  var config = {
    user:'awesomeusername',
    password:'awesomepassword',
    server:'coolservername',
    options:{
      encrypt:true,
      database:'TableName'
  }
};
var connection = new Connection(config);
var Request = require('tedious').Request;

var sql = "SELECT ColumnName FROM Database.dbo.TableName";
connection.on('connect',function(err){
  request = new Request(sql,function(err,rowCount){
  if(err){
    res.write(err);  
    console.log('got an error %s',err)
  }else{
     res.write(rowCount+'rows'); 
  }
  });

 request.on('row',function(columns){
 columns.forEach(function(column){
 res.write(column.value); 
 });

});

connection.execSql(request);
 });

 } 

所以你有我是一个完整的nodejs新手,我想我会试一试。任何提示或信息表示赞赏。提前致谢。

4

2 回答 2

4

1) 不,您不必在使用 Tedious 时在 Windows 机器上运行代码。它是用纯 javascript 编写的,应该可以在 nodejs 工作的任何地方工作。

2) 首先,我建议你升级到最新的 Tedious 0.2.x。这是一个有很多改进的主要版本。接下来,我建议您查看您的代码,因为您发布的片段的左括号{比右括号少}

基本上你的问题是你在connection.execSql(request);建立连接之前打电话或者不管连接是否成功。New Tedious 在连接错误处理方面有一些改进,也许它可以帮助您解决问题。

于 2014-04-04T12:07:47.017 回答
0
connection.on('connect',function(err){
    request = new Request(sql,function(err,rowCount){
    if(err) {
        res.write(err);  
        console.log('got an error %s',err)
    }
    else {
        res.write(rowCount+'rows'); 
    }
});

更改上面的代码如下:

connection.on('connect', function(err) {
    setInterval(()=>{
        console.log("connection.state interval"+JSON.stringify(connection.state));
    },2000);
    setTimeout(()=>{
        console.log("connection.state"+JSON.stringify(connection.state));
        if (connection.state === connection.STATE.LOGGED_IN) {
            executeStatement();// code where connecting query with req and res obj is written.
        }
    },2000);
});

connection.on('debug', function(err) { 
    console.log('debug:', err); // for exception
});
于 2018-05-29T12:03:10.517 回答