作为Node的新手,我仍然遇到一些回调问题。
在mapBpiIfindex
函数中,我试图遍历vlans
函数找到的所有VLAN。一旦它遍历所有VLAN,创建地图,我想将地图输出到浏览器。但是,我得到的唯一输出是{}
。如何将映射发送到浏览器?我甚至不确定我是否正确使用了我的回调。
var express = require('express');
var router = express.Router();
var snmp = require('snmp-native');
// Create a Session with explicit default host, port, and community.
let session = new snmp.Session({ host: 'AASW0120', port: 161, community: 'community' })
let Mibs = {
hostname: [1,3,6,1,2,1,1,5,0],
vlans: [1,3,6,1,4,1,9,9,46,1,3,1,1,2],
dot1dBasePortIfIndex: [1,3,6,1,2,1,17,1,4,1,2]
}
/* Get all VLANs on switch */
function vlans(snmpSession, cb) {
let vlans = []
session.getSubtree({ oid: Mibs.vlans }, function (error, varbinds) {
if (error) {
console.log('Fail :(');
} else {
varbinds.forEach(function (varbind) {
vlans.push(varbind.oid[varbind.oid.length -1])
})
}
cb(vlans)
})
}
/* Map BPIs to Ifindices */
function mapBpiIfindex(session, cb) {
let map = {}
vlans(session, function (vlans) {
vlans.forEach(function (vlan) {
session.getSubtree({oid: Mibs.dot1dBasePortIfIndex, community: 'community@' + vlan}, function (error, varbinds) {
if (error) {
console.log('Fail :(')
} else {
varbinds.forEach(function (varbind) {
map[varbind.oid[varbind.oid.length -1]] = {ifindex: varbind.value, vlan: vlan}
})
}
})
})
cb(map)
})
}
router.get('/vlans', function (req, res, next) {
vlans(session, function (vlans) {
res.send(vlans)
})
})
router.get('/bpi-ifindex', function (req, res, next) {
mapBpiIfindex(session, function (mapping) {
res.send(mapping)
})
})
答案 0 :(得分:0)
答案是否定的,你没有正确使用它;) 这里有一些事情:
您应该清楚仅回调中的代码在操作完成后执行,因此cb(map)
不会等到所有循环回调都完成。这就是为什么没有返回的原因(因为当调用cb时,异步函数尚未完成,并且映射值未定义。请查看此How do I return the response from an asynchronous call?,其原理相同。
查看async模块。具体来说,do *或while方法。它可以帮助您使用异步函数调用来处理循环。
除此之外,如果您关注表现,请should not use forEach。