Node.js NodeJS:回调不是函数

Node.js NodeJS:回调不是函数,node.js,express,callback,Node.js,Express,Callback,我检查了其他问题,但没有一个是我的答案。换句话说:没有答案是有效的 我有两个模块:应用程序和逻辑。应用程序将回调传递给逻辑,然后由逻辑调用。然而,我得到了错误“cb不是一个函数”。就这样,没有更多的信息 这是app.js中提出回调的函数: app.get('/assignments/open/:student', function (request, response) { var callback = function(mail, jobtitle) { response.stat

我检查了其他问题,但没有一个是我的答案。换句话说:没有答案是有效的

我有两个模块:应用程序和逻辑。应用程序将回调传递给逻辑,然后由逻辑调用。然而,我得到了错误“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);
});
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);
            })
          });
    },
这是logic.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);
});
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');
    },

如果您使用的是ES6,请尝试使用arrow函数将作用域传递给
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);
    })
});

可能问题是,您没有等待数据块处理。请尝试以下代码段。添加了一种将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))
          })
})

如果我没有猜错的话,
cb
没有在
http.get
的回调函数的范围内定义。您应该使用箭头函数来传递作用域,或者在
http.get
的回调函数中传递函数
cb
。是的,它可以工作。最好的解决方案是使用arrow函数,因为您要将整个作用域传递给函数,但如果您想访问
cb
,唯一的方法是手动将其传递到callback中。我是说第二个代码段,将cb传递给http.get回调。Will Logic.Inspect将收到的cb作为参数发送给https.get?http.get中的cb不是未定义吗?恐怕这两种方法都不起作用。。。我将用我编辑的代码编辑我的问题。