在 Node 中使用 Request 库同步 GET

Sync GET using Request library in Node

我想从 api 到 return 获取数据到我的 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() 放在回调中?

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

您需要将回调函数传递给您的 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 .

PS:使请求同步确实是一个坏主意。它不仅不符合 node.js 所坚持的想法,还会影响您的 Web 应用程序的性能。