【问题标题】:mongodb nodejs db.collection is not a functionmongodb nodejs db.collection 不是函数
【发布时间】:2018-06-04 20:57:06
【问题描述】:

这是我的 FollowerModel 类(在 ES6 中)代表我的 MongoDB 的 follower 集合

import mongo from 'mongodb';

class FollowerModel {

    constructor(db, logger) {
        this._db = db;
        this._logger = logger;
    }

    async create(data) {
        try {
            data._id = mongo.ObjectID().toString();
            return await this._db.collection('follower').insertOne(data);
        } catch (error) {
            return Promise.reject(error);
        }
    }

}

export default FollowerModel;

这是我的单元测试

import chai from 'chai';
import chaiAsPromised from 'chai-as-promised';
import { expect } from 'chai';
import mongo from 'mongodb';
import mongo_url from '../../config/mongodb';
import logger from '../../config/logger';
import to from 'await-to-js';
import FollowerModel from '../../model/follower';

const MongoClient = mongo.MongoClient;
const data = {
    email: 'my_email',
    phone: 'my_phone',
    code: 'my_code'
};

describe('Model: Follower', () => {

    let Follower;
    let connected = false;
    let _db;

    const connect = () => {
        try {
            const db = await MongoClient.connect(mongo_url);
            Follower = new FollowerModel(db, logger);
            connected = true;
            _db = db;
            return Promise.resolve();
        } catch (error) {
            return Promise.reject(error);
        }
    };

    before(() => connect());

    describe('create', () => {
        let _id;
        beforeEach(() => connected ? null : connect());
        it('Returns with insertedId', async () => {
            const [, result] = await to(Follower.create(data));
            return expect(result).to.have.property('insertedId');
        });
        afterEach(() => connected ?
            _db.collection('follower').deleteOne({ _id }) : connect().then(() => _db.collection('follower').deleteOne({ _id }))
        );
    });

});

这个测试失败了,错误是this._db.collection is not a function 让我很沮丧。当我初始化Follower 实例时,db 被传递给构造函数,在类中成功初始化db。我什至尝试console.logdb 和db.collection。它确实按预期记录db,但为db.collection 返回undefined。这让我很困惑

【问题讨论】:

标签: node.js mongodb ecmascript-6 typeerror


【解决方案1】:

MongoDB原生NodeJS驱动V3+以后:

const db = await MongoClient.connect(mongo_url);

_db = db.db("nameOfyourDataBase");

//then you can use _db.collection

【讨论】:

  • 我无法理解。我已经声明了mongo_url,其中包括数据库主机、凭据和名称
  • 也许你只需要输入你的 url 数据库主机和凭据
  • 我记录下来检查,mongo_url 返回mongodb://localhost/mydb,它确实适合包含主机、凭据和名称的连接字符串
  • 确实如此,令我惊讶。但我想了解为什么会这样。我在旧项目中使用了同样的做法,效果很好
  • 据我检查,这是node-mongodb-native 包的新版本的错误。当我切换到旧项目的旧版本 (v2.2.28) 而不是最新的 v3.0.0 时,它运行良好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2018-06-09
  • 1970-01-01
  • 2021-11-05
  • 2021-10-31
相关资源
最近更新 更多