【问题标题】:angular promises and nodejs http get response角度承诺和 nodejs http 得到响应
【发布时间】:2015-11-09 17:49:27
【问题描述】:

我会使用 angularJS 的承诺将数据填充到网格中。我想在nodeJS的服务器上“逐行”加载数据,在该服务器上使用启用了“流”的模块“mssql”,从数据库中的每一行返回到客户端。

在客户端我使用这些函数:

function asyncGreet() {
  var deferred = $q.defer();
  var _url = 'http://localhost:1212/test';

  $http.get(_url).
    then(function(result) {
      deferred.resolve(result);
        }, function(error) {
      deferred.reject(error);
        }, function(value) {
      deferred.notify(value); //<<-- In "value" I would like to get every single row
     });
     return deferred.promise;
  }

  $scope.btnTest = function () {
            var promise = asyncGreet();
            promise.then(function(res) {
                console.log('Success: ' + res.data + "\n");
            }, function(reason) {
                console.log('Failed: ' + reason);
            }, function(update) {
                console.log('Got notification: ' + update); //<<--
            });
        };

在 nodeJS 服务器上:

app.get('/test', function (req, res) {
//sql for test
var _query = 'select top 50 * from tb_test';
var sql = require('mssql');
var connection;
var config = {
    user: 'testUser',
    password: '12345',
    server: 'localhost\\test',
    database: 'testDB',
    stream: true
};

connection = new sql.Connection(config, function (err) {
    var request = new sql.Request(connection);
    request.query(_query); 

    request.on('recordset', function(columns) {
        // Emitted once for each recordset in a query
        //res.send(columns);
    });

    request.on('row', function(row) {
        res.write(JSON.stringify(row)); //<<-- I would like intercept this event on client side 
        // and get the result in my angularJS function on deferred.notify
    });

    request.on('error', function(err) {
        // May be emitted multiple times
        console.error(err)
    });

    request.on('done', function(returnValue) {
        // Always emitted as the last one
        res.end('DONE');
    });
});

});

有人可以帮我吗?

谢谢!

【问题讨论】:

  • 您不能使用 AngularJS 客户端对经典的 HTTP 请求执行此操作。您可能想看看使用 Socket.IO 之类的东西将结果一一发送,因为它们被读取
  • @Jackpot21 检查 mssql 的文档以了解管道方法。它可能像 request.pipe(res) 一样简单

标签: javascript angularjs node.js promise


【解决方案1】:

我已经使用 socket.io 完成了 :)

在 angularJS 方面:

// count the row for test only
$scope.count = 0;
  $scope.prova = function () {
    mySocket.emit('getTableByRow', {});
    mySocket.on('resRow', function (data) {
      if (data.event == 'ROW') {
        $scope.count += 1;
      }else {
        $scope.count += " !!DONE!! ";
      }
   });
};

在 NodeJS 方面:

[ ... connection with DB ... ]

io.on('connection', function (socket) {
  socket.on('getTableByRow', function (data) {
      _getTableByRow(socket, data);
  });
});

_getTableByRow 函数:

var _getTableByRow = function (socket, data) {
  var _query = 'select top 50 * from tb_test';
  request.query(_query);

  request.on('row', function(row) {
    // return only the ids for test 
    socket.emit('resRow', {event: 'ROW', data: row.id.toString()});
  });

  request.on('done', function(returnValue) {
    socket.emit('resRow', {event: 'DONE'});
  });

  request.on('recordset', function(columns) {
    console.log(columns);
  });

  request.on('error', function(err) {
    socket.emit('resRow', {event: 'ERROR', data: err});
  });
}

这样,只要从DB中读取一行,就立即发送给客户端:)

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多