【问题标题】:How to make MongoDB available inside Express' HTTP methods?如何使 MongoDB 在 Express 的 HTTP 方法中可用?
【发布时间】:2016-02-13 22:30:52
【问题描述】:

我正在尝试将 MongoDB 与 Node/Express 一起使用。我使official example 工作:

var express = require('express')
var MongoClient = require('mongodb').MongoClient
var assert = require('assert')
var app = express()

// Connection URL
var url = 'mongodb://localhost:27017/myproject'
// Use connect method to connect to the Server
MongoClient.connect(url, function(err, db) {
  assert.equal(null, err)
  console.log("Connected correctly to server")

  insertDocuments(db, function() {
    db.close()
  })
})

var insertDocuments = function(db, callback) {
  // Get the documents collection
  var collection = db.collection('documents')
  // Insert some documents
  collection.insertMany([
    // Some code
  ], function(err, result) {
    // Some code
    callback(result)
  })
}

app.get('/insert-document', function(req, res) {
  // res.send()
})

我怎样才能让 Mongo 在 Express 的 HTTP 方法中可用?例如,在app.get('/insert-document', function(req, res) 中使用insertDocuments()

编辑(完整的server.js 文件):

var express = require('express')
// var PouchDB = require('pouchdb')
var MongoClient = require('mongodb').MongoClient
var assert = require('assert')
var webpack = require('webpack')
var config = require('./webpack.dev.conf')

var app = express()
var compiler = webpack(config)

// Connection URL
var url = 'mongodb://localhost:27017/myproject'
// Use connect method to connect to the Server
var db

MongoClient.connect(url, function(err, db) {
  assert.equal(null, err)
  console.log("Connected correctly to server")
  db = db
})

var insertDocuments = function(db, callback) {
  // Get the documents collection
  var collection = db.collection('documents')
  // Insert some documents
  collection.insertMany([
    {a : 1}, {a : 2}, {a : 3}
  ], function(err, result) {
    assert.equal(err, null)
    assert.equal(3, result.result.n)
    assert.equal(3, result.ops.length)
    console.log("Inserted 3 documents into the document collection")
    callback(result)
  })
}

// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())

// serve webpack bundle output
app.use(require('webpack-dev-middleware')(compiler, {
  publicPath: config.output.publicPath,
  stats: {
    colors: true,
    chunks: false
  }
}))

// enable hot-reload and state-preserving
// compilation error display
app.use(require('webpack-hot-middleware')(compiler))

app.get('/docs', function(req, res) {
  // res.send()
  insertDocuments(db, function() {
    db.close()
  })
})

app.listen(8080, 'localhost', function (err) {
  if (err) {
    console.log(err)
    return
  }
  console.log('Listening at http://localhost:8080')
})

我明白了

TypeError:无法读取未定义的属性“集合” 在 insertDocuments (/home/alex/node/project-mongo/build/dev-server.js:24:22)

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    参考代码here,将连接db保存为一个全局变量,示例代码如下。

    var db;
    
    MongoClient.connect(url, function(err, db) {
          assert.equal(null, err)
          console.log("Connected correctly to server")
    
          db = db;
          // Start the application after the database connection is ready
          app.listen(3000);
          console.log("Listening on port 3000");
    });
    
    // Reuse database object in request handlers
    app.get('/insert-document', function(req, res) {
          // insertDocuments() could invoked here.
    });
    

    【讨论】:

    • 感谢您的回答。我得到TypeError: Cannot read property 'collection' of undefined。请参阅我的编辑。我是不是做错了什么?
    • @alex,请把函数app.listen(8080, 'localhost',放入mongoClient.connect(url, function(err, db){}),如我的回答所示...
    • 我这样做了:MongoClient.connect(url, function(err, db) { assert.equal(null, err) console.log("Connected correctly to server") db = db app.listen(8080, 'localhost', function (err) { if (err) { console.log(err) return } console.log('Listening at http://localhost:8080') }) }) 同样的错误。
    • 我意识到dbapp.get('/docs', function(req, res) 内部是未定义的。
    • 嘿,它成功了。我改为db = database。我认为db = db 将 db 重新签名为空。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2018-12-13
    相关资源
    最近更新 更多