mongodh + hapi.js:收藏没有定义?

时间:2017-12-28 18:26:14

标签: javascript mongodb hapijs

我是mongodb和Hapi.js的新手。我正在尝试为读取请求创建API,但我不确定如何在server.route中编写处理程序方法。

以下是我如何使用hapi配置我的mongoclient:



'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
    
})




转到主页路径工作正常,但是当我转到./api/tours路径时,我在终端中收到以下错误:



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)




如何正确定义集合?谢谢。

1 个答案:

答案 0 :(得分:-1)

您的错误消息表示collection超出了处理程序的范围。你在tours function内声明它。

但是如果你使用Mongoclient接近数据库和集合,你也会遇到一个小错误。

让我告诉你如何保持你的整体设置。在那里,您可以看到处理程序现在可以访问db



'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

})




我知道这只是你身边的一个学习范例。但也许你想考虑从最新的hapijs版本开始:17。有一些更大的变化涉及到它现在让你的生活更轻松。您的短代码已经有很多嵌套回调。版本17将支持使用await / async。