2015-01-05 5 views
2

Мне любопытно, есть ли способ выдать внутренний запрос в экспресс, не пройдя все фактические накладные расходы на реальный запрос. Пример показывает, вероятно, мотивация лучше:Выдача внутреннего экспресс-запроса

app.get("/pages/:page", funciton(req, res) 
{ 
    database_get(req.params.page, function(result) 
    { 
     // "Page" has an internal data reference, which we want to inline with the actual data: 
     request(result.user_href, function(user_response) 
     { 
      result.user = user.response.json; 
      res.send(result); 
     }); 
    }); 
}); 

/// .... 

app.get("/user/:name", function() ...); 

Итак, что мы имеем здесь маршрут, данные которого требуется сделать еще один запрос для получения дополнительных данных. Я хотел бы получить к нему доступ, просто сделав что-то вроде app.go_get (user_href) вместо фактического запроса тяжелого веса. Теперь я спросил, и стратегия, похоже, «расщепляет вашу логику». Тем не менее, на самом деле это требует от меня дубликата логики, так как рекурсивные данные правильно ссылаются через URL-адреса (как в примере выше). Поэтому я в конечном итоге вынужден выполнять собственные маршруты маршрутизации и дублирования.

+0

если вы расчитываете в использовании, что функциональность маршрутов некоторых других местах, то вы должны создать модуль, чтобы содержать указанную функцию для выполнения операции таким образом, вы можете позвонить функция просто вызывает модуль из любого места в вашем приложении –

+0

Я считаю, что я объяснил, почему этот вариант не был жизнеспособным для меня (хотя я могу не понимать ваш ответ). В принципе, маршрут является * частью функциональности * и поэтому не может быть помещен в отдельный модуль без написания парсера маршрута: данные похожи на data = {href: some_url}. Поэтому мне нужно иметь возможность делать get_data_at_url (data.some_url), поэтому необходимо, чтобы маршрутизация имела место. –

+0

Если вы управляете маршрутизатором, вы можете сделать что-то вроде app.get (module.myroute), где myroute = function (req, res) {} внутри модуля, где бы вы ни занимались. если ваш обработчик маршрута не использует переменные модуля, вы должны быть в порядке. для использования этой функции вы можете построить свои потоки req и response так же, как и у узла –

ответ

0

Можете ли вы избежать накладных расходов на реальный запрос? Нет. Если вам нужен href с первого запроса, чтобы перейти на объект пользователя, вам абсолютно необходимо следовать этой ссылке, сделав второй «реальный запрос».

Если у вас есть база данных пользователей, вы можете избежать запроса, указав идентификатор пользователя на странице и сделать обычный вызов базы данных вместо того, чтобы следовать своему собственному href.

Demo рефакторинг на расщеплении из логики:

// Keep as little logic as possible in your routes: 
app.get('/page/:page', function(req, res){ 
    var pageId = req.params.page; 
    makePage(pageId, function(err, result){ 
    if(err){ return res.send(500) } 
    res.send(result) 
    }) 
}) 

// Abstract anything with a bunch of callback hell: 
function makePage(pageId, callback){ 
    database_get(pageId, function(result) { 
    // Since it's only now you know where to get the user info, the second request is acceptable 
    // But abstract it: 
    getUserByHref(result.user_href, function(err, data){ 
     if(err){return callback(err)}; 
     result.user = data.json; 
     callback(null, result); 
    }); 
    }); 
} 

// Also abstract anything used more than once: 
function getUserByHref(href, callback){ 
    request(href, function(err, response, body){ 
    if(response.statusCode != 200){ 
     return callback(err); 
    } 
    var user = JSON.parse(body); 
    return callback(null, user); 
    }) 
} 

// It sounds like you don't have local users 
// If you did, you would abstract the database call, and use getUserById 
function getUserById(id, callback){ 
    db.fetch(id, function(err, data){ 
    return callback(err, data); 
    }) 
} 
+0

Итак, идея состоит в том, что объект js может содержать любое количество внутренних ссылок на разные ресурсы, поэтому вы не можете знать, использовать ли getUserByHref или getCartByHref без. .. маршрутизация. Href в json предназначены для того, чтобы иметь возможность захватить данные от клиента с помощью xmlhttprequest, а именно, что вы также можете ускорить процесс, предварительно загрузив их при начальной загрузке. Нужен аналог obj.value = express.load (obj.href), равный obj.value клиента = xmlhttprequest (obj.href). Я не ожидаю решения (я считаю, что его нет), просто кажется странным, что это не поддерживается. –

+0

Похоже, что ваш лучший вариант - абстрагировать код запроса href в 'getAnythingByHref', а затем вызывать его на ваших маршрутах, как это уместно, как в make. ( – Plato

+0

) Да, так что реализуйте парсер парсер, что и будет getAnythingByHref. , –

Смежные вопросы