在 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 应用程序的性能。
我想从 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 应用程序的性能。