Nodejs выражает возвращаемое значение функции промежуточного программного обеспечения

Я использую NodeJS и Express, у меня есть следующий маршрут и функция промежуточного программного обеспечения - Mobile. Если я не использую return next(); в функции isMobile приложение застревает, потому что NodeJS не переходит к следующей функции.

Но мне нужно, чтобы функция isMobile возвращала значение, чтобы я мог обрабатывать его соответствующим образом в app.get. Есть идеи?

app.get('/', isMobile, function(req, res){
 // do something based on isMobile return value
});



function isMobile(req, res, next) {

    var MobileDetect = require('mobile-detect');
    md = new MobileDetect(req.headers['user-agent']);

    //return md.phone(); // need this value back

    return next();
}

Спасибо.

Ответ 1

У вас есть несколько вариантов:

  1. Прикрепите значение к объекту req:

    app.get('/', isMobile, function(req, res){
       // Now in here req.phone is md.phone. You can use it:
       req.phone.makePrankCall();
    });
    
    function isMobile(req, res, next) {
        var MobileDetect = require('mobile-detect');
        md = new MobileDetect(req.headers['user-agent']);
    
        req.phone = md.phone();
        next();// No need to return anything.
    }
    

    Это количество промежуточного программного обеспечения Express/Connect, передающего значения. Например, bodyParser, который присоединяет свойство body к объекту запроса, или промежуточное программное обеспечение сеанса, которое присоединяет свойство сеанса к объекту запроса.

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

  1. Не делайте это промежуточным ПО, просто используйте функцию напрямую. Если он не асинхронный, как описано выше, и не будет использоваться глобально для всех маршрутов (не будет что-то вроде этого: app.use(isMobile)), это также хорошее решение:

    app.get('/', function(req, res){
       var phone = isMobile(req);
       phone.makePrankCall();
    });
    
    function isMobile(req) {
        var MobileDetect = require('mobile-detect');
        md = new MobileDetect(req.headers['user-agent']);
    
        return md.phone();
    }
    

Если это дорого для вычисления, и вы можете использовать его в более чем одном промежуточном программном обеспечении, вы можете кэшировать его с помощью карты слабых карт.

Ответ 2

Создайте выражение функции, которое возвращает промежуточное ПО:

var isMobile = function() {
    return function(req, res, next) {
        next();
    }
};

app.get('/endpoint', isMobile(), ...)