【问题标题】:Proper Way to Connect MongoDB Native Driver Node JS连接MongoDB Native Driver Node JS的正确方法
【发布时间】:2019-10-22 03:19:18
【问题描述】:

也许标题和问题有点愚蠢,但我一直对此感到困惑。

这里有一个名为 service.js 的文件,稍后将用于保存 Db 实例

module.exports = {
  db: undefined
}

Mongo.js 连接和分配数据库属性。

const { MongoClient } = require('mongodb')
const { mongoUrl, mongoOptions } = require('../../config')
const services = require('../services')

class Mongo {
  constructor () {
    this.client = new MongoClient(mongoUrl, mongoOptions)
  }

  init () {
    this.client.connect((err, res) => {
      if (!err) services.db = res.db()
    })
  }
}

module.exports = new Mongo()

和 app.js 配置 express 并启动 mongo 连接

const express = require('express')
const mongo = require('../lib/db/mongo')
const services = require('../lib/services')
const app = express()

mongo.init()

app.get('/', async (req, res) => {
  const User = services.db.collection('users')
  const getall = await User.find({}).sort({ _id: -1 }).limit(10).toArray()
  res.json(getall)
})

module.exports = app

当我尝试收听和访问这些代码时,它们能够运行。但是当我尝试使用 Mocha 对其进行测试时,就会出现问题

const app = require('../bin/app')
const chai = require('chai')
const expect = chai.expect
const request = require('supertest')

describe('Get User', () => {
  describe('GET /', () => {
    it('will get last 10 user', () => {
      request(app)
        .get('/')
        .expect('Content-Type', /json/)
        .expect(200)
        .end((end, res) => {
          console.log(res)
        })
    })
  })
})

我有错误

(node:16652) UnhandledPromiseRejectionWarning: TypeError: services.db.collection is not a function
    at app.get (C:\Users\Lenovo\dev\absensi-selfie-api-new\bin\app.js:23:28)
    at Layer.handle [as handle_request] (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:275:10)
    at urlencodedParser (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\body-parser\lib\types\urlencoded.js:91:7)
    at Layer.handle [as handle_request] (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:275:10)
    at jsonParser (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\body-parser\lib\types\json.js:110:7)
    at Layer.handle [as handle_request] (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:275:10)
    at cors (C:\Users\Lenovo\dev\absensi-selfie-api-new\bin\app.js:10:3)
    at Layer.handle [as handle_request] (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:275:10)
    at logger (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\morgan\index.js:144:5)
    at Layer.handle [as handle_request] (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:275:10)
    at expressInit (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\middleware\init.js:40:5)
    at Layer.handle [as handle_request] (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:275:10)
    at query (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\middleware\query.js:45:5)
    at Layer.handle [as handle_request] (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\router\index.js:174:3)
    at Function.handle (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\application.js:174:10)
    at Server.app (C:\Users\Lenovo\dev\absensi-selfie-api-new\node_modules\express\lib\express.js:39:9)
    at Server.emit (events.js:189:13)
    at parserOnIncoming (_http_server.js:676:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:109:17)
(node:16652) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was
not handled with .catch(). (rejection id: 1)
(node:16652) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

也许这可以通过使用 Mongoose 来完成,但我想先使用 MongoDB 本机驱动程序来尝试。

有什么想法吗?谢谢。

【问题讨论】:

    标签: javascript node.js mongodb testing mocha.js


    【解决方案1】:

    试试这个

    const express = require('express')
    const mongo = require('../lib/db/mongo')
    const app = express()
    
    mongo.init()
    const services = require('../lib/services')
    app.get('/', async (req, res) => {
      const User = services.db.collection('users')
      const getall = await User.find({}).sort({ _id: -1 }).limit(10).toArray()
      res.json(getall)
    })
    
    module.exports = app
    

    mongodb连接初始化后导入服务

    【讨论】:

    • 感谢您的回答,但很遗憾这不起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 2013-08-12
    • 2012-12-19
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2019-12-05
    • 2020-03-31
    相关资源
    最近更新 更多