使用AngularJS和Node.js进行异步调用

时间:2016-09-30 13:50:46

标签: angularjs ajax node.js asynchronous

AngularJS和Node.js的新手。请指教。

因为我想在页面上显示的数据需要很长时间才能加载。我决定先从database_1加载快速数据,然后稍后从database_2获取慢响应。这是我的AngularJS:

var app = angular.module('myApp', [

]);

app.factory('rateFactory', function ($http) {
    return $http.get("localhost/rate"); // api or node.js to return only issueId and rate
})

app.controller('SignupController', function ($scope, $http, $filter, rateFactory) {
    // Display most of the content first
    $scope.showData = function () {
        $http.get("localhost/signup") // api or node.js
        .success(function (response) {
            $scope.Signups = response;

            $scope.curPage = 0;
            $scope.pageSize = 25;
            $scope.numberOfPages = function () {
                return Math.ceil($scope.Signups.length / $scope.pageSize);
            };
        })
        .error(function (data, status, headers, config) {
            alert(status);
        });
    }

    // Display slow response, Rate, later based on the issueId
    $scope.showRate = function (issueId) {
        rateFactory
        .success(function (data) {
            document.getElementById(issueId).innerHTML = data.find(x => x.IssueID === issueId).Rate;
        })
        .error(function (data, status, headers, config) {
            //alert(status);
        });
    }
});

我想知道是否有更好的方法来做到这一点。这是我的第一个问题。 下一个问题是关于Node.js.如果我从ashx或api获取数据,它会毫无问题地返回数据。但是当对两个调用使用Node.js时,它是一个命中和未命中。有时它工作正常,但大多数时候,第二次调用失败。难道我做错了什么?如果单独调用,两者都会完美地返回数据这是node.js代码:

var express = require('express');
var http = require('http');
var app = express();
var usp2Json = require('./lib/usp2Json.js');

app.get('/iisnode/myApp/signup', function(req, res) {
    usp2Json.getJsonFromStoredProc('stroedprocToGetSignup', req, res);
});

app.get('/iisnode/myApp/rate', function(req, res) {
    usp2Json.getJsonFromStoredProc('stroedprocToGetRate', req, res);
})

var server = http.createServer(app);
var port = process.env.PORT || 593;
server = app.listen(port, function() {
    console.log('Server is running...');
});

usp2Json.js是一个自定义模块,用于通过存储过程从SQL Server获取数据:

exports.getJsonFromStoredProc = function(storedproc, req, res) {
var sql = require("mssql");
var express = require('express');
var app = express();

res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

// config database
var config = {
    user: 'username',
    password: 'password',
    server: 'servername',
    database: 'databasename',
};

// connect to database
sql.connect(config, function(err) {
    if(err) console.log(err);

    // create Request object
    var request = new sql.Request();

    // query to the database and get the records
    request.query(storedproc, function(err, recordset) {
        if(err) 
            console.log(err);

        // send records as a response
        res.send(recordset);
    });
});
}

2 个答案:

答案 0 :(得分:0)

我的一个建议就是摆脱:

document.getElementById(issueId).innerHTML = data.find(x => x.IssueID === issueId).Rate;

使用常规的Angular 2方式数据绑定,并将#issueId元素绑定到$scope.issueId范围变量,并在调用成功时更新范围变量。现在这样做是一种反模式。

就NodeJS API调用而言,您需要向我们展示路由处理程序,即usp2Json.getJsonFromStoredProc在其代码中的作用。否则你的代码看起来很完美

答案 1 :(得分:0)

就NodeJS API调用而言,问题实际上是SQL Server连接。当我查看console.log时,它并没有给我足够的信息,只是说"服务器正在运行"。我不得不添加一行来获取错误的详细信息:

request.query(storedproc, function (err, recordset) {
        if (err) {                
            fs.appendFile("path"+ datetime+".txt", time + " Error on executing " + storedproc + " - " + err + " \r\n")
            //throw (err);
        }

        // send records as a response
        res.send(recordset);
    });

这给了我" ConnectionError:Connection已关闭。"。有了这些信息,我就可以从这里找到解决方案:

https://github.com/patriksimek/node-mssql/issues/138

并从Stackoverflow回答:How can I use a single mssql connection pool across several routes in an Express 4 web application?