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);
});
});
}
答案 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?