Общий способ обработки рефакторинга - определить, что отличается от вашего кода, и извлечь его как динамическую часть, которая передается в функцию, содержащую общий код.
Например, две вещи, которые отличаются вот путь, на котором запросы случаются
'/companies' vs '/companies/:id'
И соответствующий путь, который получает передается http.get
'/companies' vs '/companies/' + req.params.id
Вы можете извлечь их и передайте их в функцию, которая назначит вам обработчик.
Вот общий подход:
// props contains the route and
// a function that extracts the path from the request
function setupGet(router, props) {
router.get('/' + props.route, function(req, res, next) {
http.get({
host: 'http://api.com',
path: props.getPath(req)
}, function(response) {
var body = '';
response.on('data', function(d) {
body += d;
});
});
res.render('company', {
data: body
});
});
}
И затем вызвать его с двумя вариантами:
setupGet(router, {
route: 'companies',
getPath: function(req) {
return 'companies';
}
});
setupGet(router, {
route: 'companies/:id',
getPath: function(req) {
return 'companies' + req.params.id;
}
});
Преимущество здесь в том, что вы можете использовать любую комбинацию маршрутов и путей, а также использование другие свойства req
для определения пути.
Еще одна вещь, вы должны понимать, что ваш res.render
вызов будет перед тем вы body += d
, потому что прежний происходит синхронно сразу после вызова http.get
и последнего происходит асинхронно (через некоторое время).
Возможно, вы захотите установить метод render
в самом обратном вызове.
// props contains the route and
// a function that extracts the path from the request
function setupGet(router, props) {
router.get('/' + props.route, function(req, res, next) {
http.get({
host: 'http://api.com',
path: props.getPath(req)
}, function(response) {
var body = '';
response.on('data', function(d) {
body += d;
// probably want to render here
res.render('company', {
data: body
});
});
});
});
}
хороший момент. Я все еще привык к этому асинхронному материалу Я не смогу создать одну модель, чтобы я мог позвонить/компании на более чем одной странице? Я спрашиваю, потому что асинхронный запрос должен будет заполнить запрос-ответ, чтобы получить данные. каждый раз, когда мне нужно будет отображать все компании, мне нужно будет сделать http-запрос и отправить данные в обратном вызове? – handsome
Ну, если компании не меняются, вы можете где-то их хранить в памяти и сделать запрос в первый раз, сохранить компании, а затем каждый раз после этого просто вернуть сохраненное значение. Вы хотите, чтобы я редактировал свой вопрос и показывал вам пример? – nem035
, что имеет смысл, но я ищу что-то более ориентированное на модель, как старый добрый PHP, поэтому я могу использовать логику вместо того, чтобы делать все эти http-вызовы во всем мире. Спасибо чувак! – handsome