使用Node中的Request库同步GET

时间:2015-02-04 22:31:30

标签: node.js express request pug

我想从api获取数据以返回我的Jade页面。

如何使GET请求同步,以便渲染等到它有数据?

这是我的API服务:

var request = require('request');
var constants = require('../config/constants');

var service = {
    get: function (url) {
        url = constants.API.URL + url;

        return request(url, function (error, response, body) {
            return JSON.parse(body);
        });
    }
}

module.exports = service;

以下是我使用它的方式:

var api = require('./api');

var service = {
    list: function (success) {
        return api.get('companies');
    },
    names: function () {
        return api.get('companies/names');
    }
};

module.exports = service;

这是我的控制器:

var controller = function (app) {
    var companyService = require('../services/companies');

    app.get('/companies', function (req, res, next) {
        return res.render('companies', { title: 'Companies', companies: companyService.list() });
    });
};

module.exports = controller;

编辑:好的,理解这是一个坏主意是有道理的。我真正的问题是我的中间件,用于获取公司并将其添加到每个页面:

module.exports = function (req, res, next) {
    var companyService = require('../services/companies');

    if (req.method === 'GET') {
        if (!req.session.companies) {
            req.session.companies = companyService.names();
        }

        if (!req.session.companies) {
            res.redirect('/logout');
        }

        if (!req.session.currentCompany) {
            req.session.currentCompany = req.session.companies[0];
        }

        res.locals.companies = req.session.companies;
        res.locals.currentCompany = req.session.currentCompany;
    }

    next();
}

app.js

app.use(companiesMiddleware);

如何在加载公司之前阻止加载页面,以便将它们添加到顶部的选择列表中?我是否将next()放入回调中?

只有少数几家公司因此在会话中保存它不会影响性能,而且我很可能会在以后使用缓存来加快速度。所以这只是为了在每次加载页面时如何执行它。

1 个答案:

答案 0 :(得分:1)

您需要将回调函数传递给api,其中包含页面呈现。你可以这样做:

Api服务:

var service = {
    get: function (url, success) {
        url = constants.API.URL + url;

        return request(url, function (error, response, body) {
            var result = JSON.parse(body);
            success(result);
        });
    }
}

您的服务:

var service = {
    list: function (success) {
        return api.get('companies', success);
    },
    names: function (success) {
        return api.get('companies/names', success);
    }
};

你是控制者:

app.get('/companies', function (req, res, next) {
    companyService.list(function(companies) {
        return res.render('companies', { title: 'Companies', companies: companies });
    });        
});

如果您要为每个请求多次请求服务(例如,为了吸引公司,用户等),那么我建议您查看async库以保存您callback hell。< / p>

PS:使请求同步是一个非常糟糕的主意。不仅与node.js的观点不相符,它还会影响Web应用程序的性能。