Node.js NodeJS:回调不是函数
我检查了其他问题,但没有一个是我的答案。换句话说:没有答案是有效的 我有两个模块:应用程序和逻辑。应用程序将回调传递给逻辑,然后由逻辑调用。然而,我得到了错误“cb不是一个函数”。就这样,没有更多的信息 这是app.js中提出回调的函数: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
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不是未定义吗?恐怕这两种方法都不起作用。。。我将用我编辑的代码编辑我的问题。