Node.js модульные функции - PullRequest
0 голосов
/ 28 июня 2018

У меня есть две функции, одна «calcID», которая вычисляет, соответствует ли переданный demo_id документу _id после выполнения некоторых вычислений с помощью механизма агрегирования MongoDB и mongoose, и другая функция, называемая «getDemoID», которая использует эту предыдущую функцию для получения всех документов с этот рассчитанный идентификатор, а затем выполнить дальнейшую обработку документов (например, зарегистрировать некоторые идентификаторы) ...:

var calcID = function(demo_id) {
    //e.g. demo_id = 928106329281
    var result = FlexPotenzial.aggregate([ 
        {
            $addFields: {
                subID:  {
                    "$eq": [{"$trunc": {"$divide": ["$_id", 1000000]}},+demo_id]
                }
            }
        },
        {
            "$match": { subID : true }
        }   
    ])      
}

exports.getDemoID = function(req,res) {
    calcID(req.params.demo_id, function(err, flPot) {
    flPot => {
            for (let doc of flPot) {
                console.log(doc.id);
            }           
        }
    }
    ).catch(e => { console.log(e); res.error(e);});
}

Проблема в том, что моя функция calcID, по-видимому, ничего не возвращает, хотя я протестировал агрегацию в оболочке mongoose и синтаксис правильный, но я ничего не получаю при передаче id в качестве параметра url в URL-адресе маршрута ( получить метод) ... Я бы хотел еще больше модулировать свои функции, чтобы я мог повторно использовать код, который часто повторяется ...

Мой вопрос сейчас таков: как я могу передать найденные документы на этапе агрегации во вторую функцию и использовать их там? Я новичок в Node или вообще в стилях javascript, и я не уверен, каков тип возвращаемого результата структуры агрегации ... может быть, это вообще невозможно?

1 Ответ

0 голосов
/ 28 июня 2018

Вам нужно либо передать обратный вызов для агрегирования, либо использовать .exec(), когда вы закончите, чтобы получить от него обещание. В mongoose есть много вещей, которые могут быть .then (), даже если они не являются реальными обещаниями, и Aggregate является одним из них. Однако если вы агрегируете (...). Exec (), вы всегда получаете реальное обещание.

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

async function myMiddleware(req, res, next) {
  const { demo_id } = req.params;
  req.results = await FlexPotenzial.aggregate([ 
      {
          $addFields: {
              subID:  {
                  "$eq": [{"$trunc": {"$divide": ["$_id", 1000000]}},+demo_id]
              }
          }
      },
      {
          "$match": { subID : true }
      }   
  ]).exec();
  next();
}

// All routes matching this will use the middleware
app.use('/aggregate-me/:demo_id*', myMiddleware);

// And then we can access req.results anywhere further down the stream....
app.get('/aggregate-me/:demo_id/something', doSomething); 
app.get('/aggregate-me/:demo_id/somethingElse', doSomethingElse);

Вы также можете использовать промежуточное ПО для одиночных маршрутов

app.get('/something-entirely-different/:demo_id', myMiddleware, (req,res)=>{
    res.json(results);
});  

Или даже:

app.get('/abc', [tonsof, middleware, inAnArray], endpoint);

Правило состоит в том, чтобы продолжать использовать next() для продолжения цепочки промежуточного программного обеспечения и что-то вроде res.end для ее завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...