NodeJS: обратный вызов не функция - PullRequest
0 голосов
/ 15 мая 2018

Я проверил другие вопросы, но ни один из них не отвечает на мой. Другими словами: нет ответа.

У меня есть два модуля: приложение и логика. Приложение передает обратный вызов в логику, которую затем вызывает логика. Однако я получаю сообщение об ошибке «cb не является функцией». Вот и все, больше информации нет.

Это функция в app.js, которая создает обратный вызов:

app.get('/assignments/open/:student', function (request, response) {
  var callback = function(mail, jobtitle) {
    response.status(200).json(logic.getOpenAssignments(request.params.student));
  }

  logic.examine(request, callback);
});

Это функция в logic.js, которая вызывает обратный вызов:

examine: function (request, cb) {
        var options = {
            host: 'graph.microsoft.com',
            path: '/v1.0/me',
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': request.get('Authorization')
            }
        };

        var req = http.get(options, function(res) {
            res.on('data', function(chunk) {
                chunk = JSON.parse(chunk);
                mail = chunk['mail'];
                jobtitle = chunk["jobTitle"];
                cb(mail, jobtitle);
            })
          });
    },

Есть какие-нибудь решения? Заранее спасибо!

Редактировать:

Следующий код не работает:

examine: function (request, cb) {
        var options = {
            host: 'graph.microsoft.com',
            path: '/v1.0/me',
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': request.get('Authorization')
            }
        };

        var req = http.get(options, res => {
            res.on('data', chunk => {
                chunk = JSON.parse(chunk);
                mail = chunk['mail'];
                jobtitle = chunk["jobTitle"];
                cb(mail, jobtitle);
            })
          });
    },

Следующий код также не работает, значит ли это, что проблема не в сфере?

examine: function (request, cb) {
        var options = {
            host: 'graph.microsoft.com',
            path: '/v1.0/me',
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': request.get('Authorization')
            }
        };

        cb('hehe', 'hoho');
    },

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Возможно, проблема в том, что вы не ожидаете обработки блока данных. Попробуйте следующий фрагмент. Добавлен способ конвертировать http.get в обещания (очень часто), и это позволяет избежать передачи всех грязных обратных вызовов.

//put this somewhere inside where examine is located.
logic.httpGet = options => {
  return new Promise((resolve, reject) => {
    http.get(options, res => {
      res.setEncoding('utf8');
      let body = ''; 
      res.on('data', chunk => body += chunk);
      res.on('end', () => resolve(body));
    }).on('error', reject);
  });
};

//convert your route like this
app.get('/assignments/open/:student', function (request, response) {
  cont options = {
        host: 'graph.microsoft.com',
        path: '/v1.0/me',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': request.get('Authorization')
        }
    };
  return logic
          .httpGet(options)
          .then((data)=>{
             const data =JSON.parse(data);
             //i don't see where you use the processed data but do whatever you want below here
           repsonse.status(200).json(logic.getOpenAssignments(request.params.student))
          })
})
0 голосов
/ 15 мая 2018

Если вы используете ES6, попробуйте использовать функцию стрелки, чтобы передать область функции обратного вызова http.get:

var req = http.get(options, res => {
    res.on('data', chunk => {
        chunk = JSON.parse(chunk);
        mail = chunk['mail'];
        jobtitle = chunk["jobTitle"];
        cb(mail, jobtitle);
    })
});

Или вы также можете передать cb в функцию обратного вызова:

var req = http.get(options, function(res, cb) {
    res.on('data', function(chunk, cb) {
        chunk = JSON.parse(chunk);
        mail = chunk['mail'];
        jobtitle = chunk["jobTitle"];
        cb(mail, jobtitle);
    })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...