同时调用两个不同的 api 的路由时出现 MEAN Stack Error
MEAN Stack Error when calling two different api's routes at the same time
angularjs、mongoose 或 MongoLab 有一些问题。如果同时对不同的 api 路由进行两次 api 调用,数据将不会加载。所以我通过等待每次通话完成(有承诺)然后再进行下一次通话来使其工作。这种方式对我来说听起来不太好,因为如果任何调用失败,则页面的其余部分将不会加载。无论如何我可以避免等待吗?这是我现在得到的示例。
AngularJS 控制器工作代码:
// get profiles
HomeServices.getProfile()
.then(function (result) {
$scope.profiles = result.data;
// get portfolios
HomeServices.getPortfolios()
.then(function (result) {
$scope.portfolios = result.data;
}, function (error) {
console.log(error.statusText);
});
}, function (error) {
console.log(error.statusText);
});
API的:
// profile api
api.get('/profiles', function (req, res) {
// model schema
var profile = require('../models/Profile');
// create db connection
var db = mongoose.createConnection(config.server.db);
// set model
var model = db.model('profile', profile, 'Profiles');
// find videos
model.find({}, function (err, data) {
if (err) {
res.status(500).send(err);
} else {
res.status(200).send(data);
}
// disconnect db
mongoose.disconnect();
});
});
// portfolio api
api.get('/portfolios', function (req, res) {
// model schema
var portfolio = require('../models/Portfolio');
// create db connection
var db = mongoose.createConnection(config.server.db);
// set model
var model = db.model('portfolio', portfolio, 'Portfolios');
// find videos
model.find({}, function (err, data) {
if (err) {
console.log(err);
res.status(500).send(err);
} else {
res.status(200).send(data);
}
// disconnect db
mongoose.disconnect();
});
});
这是我希望能够做到的:
// get profiles
HomeServices.getProfile()
.then(function (result) {
$scope.profiles = result.data;
}, function (error) {
console.log(error.statusText);
});
// get portfolios
HomeServices.getPortfolios()
.then(function (result) {
$scope.portfolios = result.data;
}, function (error) {
console.log(error.statusText);
});
这是我从 MongoLab 得到的错误:
{ [MongoError: server mongolab.com:59661 sockets closed] name: 'MongoError', message: 'server db... sockets closed' }
更新:删除 mongoose.disconnect();一切都按需要工作。但我不想在每个端点都创建一个连接。
我认为错误来自 mongo 连接的常量 create/close。要在多个端点上维持单个连接:
var Portfolio = require("../models/Portfolio")
var Profile = require("../models/Profile")
var db = mongoose.connect(config.server.db)
db.connection.once("connected", function() {
api.get("/profiles", function(req, res) { ... });
api.get("/portfolios", function(req, res) { ... });
});
您正在使用 createConnection()
,它用于创建与多个数据库的连接。从这些端点来看,您可能不需要它。我会改用 connect()
。
我建议阅读有关连接的更多信息 here
顺便说一句,我在文件的顶部定义了 Portfolio 和 Profile,因为它们可能会在不同的端点上重复。
angularjs、mongoose 或 MongoLab 有一些问题。如果同时对不同的 api 路由进行两次 api 调用,数据将不会加载。所以我通过等待每次通话完成(有承诺)然后再进行下一次通话来使其工作。这种方式对我来说听起来不太好,因为如果任何调用失败,则页面的其余部分将不会加载。无论如何我可以避免等待吗?这是我现在得到的示例。
AngularJS 控制器工作代码:
// get profiles
HomeServices.getProfile()
.then(function (result) {
$scope.profiles = result.data;
// get portfolios
HomeServices.getPortfolios()
.then(function (result) {
$scope.portfolios = result.data;
}, function (error) {
console.log(error.statusText);
});
}, function (error) {
console.log(error.statusText);
});
API的:
// profile api
api.get('/profiles', function (req, res) {
// model schema
var profile = require('../models/Profile');
// create db connection
var db = mongoose.createConnection(config.server.db);
// set model
var model = db.model('profile', profile, 'Profiles');
// find videos
model.find({}, function (err, data) {
if (err) {
res.status(500).send(err);
} else {
res.status(200).send(data);
}
// disconnect db
mongoose.disconnect();
});
});
// portfolio api
api.get('/portfolios', function (req, res) {
// model schema
var portfolio = require('../models/Portfolio');
// create db connection
var db = mongoose.createConnection(config.server.db);
// set model
var model = db.model('portfolio', portfolio, 'Portfolios');
// find videos
model.find({}, function (err, data) {
if (err) {
console.log(err);
res.status(500).send(err);
} else {
res.status(200).send(data);
}
// disconnect db
mongoose.disconnect();
});
});
这是我希望能够做到的:
// get profiles
HomeServices.getProfile()
.then(function (result) {
$scope.profiles = result.data;
}, function (error) {
console.log(error.statusText);
});
// get portfolios
HomeServices.getPortfolios()
.then(function (result) {
$scope.portfolios = result.data;
}, function (error) {
console.log(error.statusText);
});
这是我从 MongoLab 得到的错误:
{ [MongoError: server mongolab.com:59661 sockets closed] name: 'MongoError', message: 'server db... sockets closed' }
更新:删除 mongoose.disconnect();一切都按需要工作。但我不想在每个端点都创建一个连接。
我认为错误来自 mongo 连接的常量 create/close。要在多个端点上维持单个连接:
var Portfolio = require("../models/Portfolio")
var Profile = require("../models/Profile")
var db = mongoose.connect(config.server.db)
db.connection.once("connected", function() {
api.get("/profiles", function(req, res) { ... });
api.get("/portfolios", function(req, res) { ... });
});
您正在使用 createConnection()
,它用于创建与多个数据库的连接。从这些端点来看,您可能不需要它。我会改用 connect()
。
我建议阅读有关连接的更多信息 here
顺便说一句,我在文件的顶部定义了 Portfolio 和 Profile,因为它们可能会在不同的端点上重复。