同时调用两个不同 api 的路由时出现 MEAN Stack Error

Posted

技术标签:

【中文标题】同时调用两个不同 api 的路由时出现 MEAN Stack Error【英文标题】:MEAN Stack Error when calling two different api's routes at the same time 【发布时间】:2015-08-18 16:00:18 【问题描述】:

在使用 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();一切都按需要工作。但我不想在每个端点都创建连接。

【问题讨论】:

为什么要连接/断开每个端点的数据库?我不熟悉该错误,但我猜它来自您尝试同时建立 2 个数据库连接的事实。 我是新手,这意味着堆栈。我删除了猫鼬断开连接,现在它工作正常。现在的问题是在哪里/如何创建数据库连接? 我在应用初始化时创建了数据库连接。您的问题发生了重大变化,我建议将其作为一个新问题提出,而不是将其从一个问题转变为另一个问题。 (提示:上述问题可能已经在 SO 上提出并回答) 【参考方案1】:

我相信错误来自于 mongo 连接的不断创建/关闭。要在多个端点上维持单个连接:

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,因为它们可能在不同的端点上重复。

【讨论】:

以上是关于同时调用两个不同 api 的路由时出现 MEAN Stack Error的主要内容,如果未能解决你的问题,请参考以下文章

调用 API 函数时出现 ESP 错误?

Azure Functions 应用程序 + Auth0 提供程序,使用身份验证令牌调用 API 时出现 401

使用 Asana API 更新任务时出现“请求没有匹配的路由”消息

发送 api 活动请求时出现“未为帐户启用路由”错误

使用 Zuul 代理服务器时出现“网关超时”错误

在浏览器中调用oAuth2 api时出现404错误