2017-05-09 7 views
0

Nodeを初めて使用しているため、私はまだコールバックに問題があります。Node.jsループバックでのコールバックの問題

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: '[email protected]' + 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

答えはノー、youreのはそれを正しく使用していません。)ここで いくつかのこと:

  1. あなたはコールバック内のみコードを操作した後に実行されることは明らかであろう終了したので、cb(map)はループバックされたコールバックがすべて終了するまで待機しません。 CBが呼び出されたときに、非同期機能はまだ終わっていないと、マップの値が定義されていませんので、ザッツなぜ何も(返されません。このHow do I return the response from an asynchronous call?を見てください、その同じ原理。

  2. asyncモジュールを見てください。具体的に、*またはメソッドながらやる。それはあなたが非同期関数呼び出しでループを処理お手伝いします。それとは別に

  3. 、あなたはshould not use forEachあなたはパフォーマンスについて気にしている場合。

関連する問題