2017-12-28 5 views
-1

Ich bin neu in mongodb und Hapi.js. Ich versuche, eine API für Leseanforderungen zu erstellen, bin mir aber nicht sicher, wie ich die Handler-Methode in server.route schreiben soll.mongodh + hapi.js: Sammlung ist nicht definiert?

Hier ist, wie ich meinen mongoclient mit hapi konfiguriert haben:

'use strict'; 
 

 
var MongoClient = require('mongodb').MongoClient; //using version 3.x 
 
var Hapi = require('hapi');//using v16 
 

 
var url = 'mongodb://****:****@ds131687.mlab.com:31687/learning_mongo'; 
 

 
var db; 
 

 
var server = new Hapi.Server(); 
 

 
server.connection({ 
 
    port:8080 
 
}); 
 

 
server.route([ 
 
    // Get tour list 
 
    { 
 
     method: 'GET', 
 
     path: '/api/tours', 
 
     handler: function(request, reply){ 
 
      collection.find().toArray(function(err,tours){ 
 
       reply(tours); 
 
      }); 
 
     } 
 
    }, 
 
    // Home page 
 
    { 
 
     method: 'GET', 
 
     path: '/', 
 
     handler: function(request, reply) { 
 
      reply("Hello world from Hapi/Mongo example."); 
 
     } 
 
    } 
 
]); 
 

 
var tours = function(db, callback) { 
 
    var collection = db.collection('tours'); 
 

 
    collection.find().toArray(function(err, docs){ 
 

 
      console.log(docs); 
 
      callback; 
 
     }); 
 
    
 
}; 
 

 
MongoClient.connect(url, function(err,client) { 
 
    
 
    server.start(function(err) { 
 
     
 
     tours(client.db('learning_mongo'), function(){ 
 
      
 
      console.log('Hapi is listening to http://localhost:8080'); 
 
      client.close(); 
 
      
 
     }); 
 
    });//end server 
 
    
 
})

auf die Homepage Weg gehen funktioniert gut, aber wenn ich gehe Weg ./api/tours, ich erhalten den folgenden Fehler in Terminal:

Debug: internal, implementation, error 
 
    ReferenceError: Uncaught error: collection is not defined 
 
    at handler (/home/ubuntu/workspace/index.js:22:13) 
 
    at Object.internals.handler (/home/ubuntu/workspace/node_modules/hapi/lib/handler.js:101:51) 
 
    at request._protect.run (/home/ubuntu/workspace/node_modules/hapi/lib/handler.js:32:23) 
 
    at module.exports.internals.Protect.internals.Protect.run (/home/ubuntu/workspace/node_modules/hapi/lib/protect.js:60:12) 
 
    at exports.execute (/home/ubuntu/workspace/node_modules/hapi/lib/handler.js:26:22) 
 
    at each (/home/ubuntu/workspace/node_modules/hapi/lib/request.js:401:16) 
 
    at iterate (/home/ubuntu/workspace/node_modules/items/lib/index.js:36:13) 
 
    at done (/home/ubuntu/workspace/node_modules/items/lib/index.js:28:25) 
 
    at module.exports.internals.Auth.internals.Auth._authenticate (/home/ubuntu/workspace/node_modules/hapi/lib/auth.js:222:16) 
 
    at internals.Auth.authenticate (/home/ubuntu/workspace/node_modules/hapi/lib/auth.js:197:17)

Wie definiere ich die Sammlung richtig? Vielen Dank.

Antwort

-1

Ihre Fehlermeldung bedeutet, dass collection innerhalb des Handlers außerhalb des Bereichs liegt. Sie deklarieren es innerhalb der tours function.

Aber Sie haben auch einen kleinen Fehler, wie Sie die Datenbank und die Sammlung mit dem Mongoclient nähern.

Lassen Sie mich Ihnen zeigen, wie es funktionieren würde, während Sie Ihre allgemeine Einrichtung behalten. Dort können Sie sehen, dass der Handler jetzt auf db zugreifen kann.

'use strict'; 
 

 
var MongoClient = require('mongodb').MongoClient; //using version 3.x 
 
var Hapi = require('hapi'); //using v16 
 

 
var url = 'mongodb://****:****@ds131687.mlab.com:31687/'; 
 

 
var db; 
 

 
var server = new Hapi.Server(); 
 

 
server.connection({ 
 
    port: 8080 
 
}); 
 

 
server.route([ 
 
    // Get tour list 
 
    { 
 
    method: 'GET', 
 
    path: '/api/tours', 
 
    handler: function(request, reply) { 
 
     db.collection('tours').find().toArray(function(err, tours) { 
 
     reply(tours); 
 
     }); 
 
    } 
 
    }, 
 
    // Home page 
 
    { 
 
    method: 'GET', 
 
    path: '/', 
 
    handler: function(request, reply) { 
 
     reply("Hello world from Hapi/Mongo example."); 
 
    } 
 
    } 
 
]); 
 

 
var tours = function(db, callback) { 
 
    db.collection('tours').find().toArray(function(err, docs) { 
 

 
    console.log(docs); 
 
    callback; 
 
    }); 
 

 
}; 
 

 
new MongoClient.connect(url, function(err, client) { 
 
    db = client.db('learning_mongo') 
 

 
    server.start(function(err) { 
 
    tours(db, function() { 
 

 
     console.log('Hapi is listening to http://localhost:8080'); 
 
     client.close(); 
 

 
    }); 
 
    }); //end server 
 

 
})

Ich verstehe, dass dies nur ein Lern ​​Beispiel von Ihrer Seite ist. Aber vielleicht möchten Sie in Betracht ziehen, mit der neuesten hapijs-Version zu beginnen: 17. Es sind einige größere Änderungen involviert und es macht Ihr Leben einfacher, mit dieser Version zu beginnen. Ihr Funktionscode enthält bereits viele verschachtelte Rückrufe. Version 17 unterstützt die Verwendung von "Warten/Asynchron".

+0

Danke! Als ich Ihr Beispiel anwendete, bekam ich einen Fehler: TypeError: Kann die Eigenschaft 'db' von null nicht lesen. Es scheint, von dieser Linie zu sein: db = client.db ('learning_mongo') – redshift

+0

Behoben: Es war ein Authentifizierungsproblem, also musste ich sicherstellen, dass die URL korrekt war. Es war nicht, also habe ich es korrigiert und es ist jetzt in Ordnung! Vielen Dank! – redshift