我想从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()放入回调中?
只有少数几家公司因此在会话中保存它不会影响性能,而且我很可能会在以后使用缓存来加快速度。所以这只是为了在每次加载页面时如何执行它。
答案 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应用程序的性能。