【问题标题】:Type Error in Promisifying Mongoose ConnectPromisifying Mongoose Connect 中的类型错误
【发布时间】:2016-04-30 08:29:47
【问题描述】:

我尝试使用 bluebird 来 Promisify Mongoose connect,我需要减少回调,所以我使用了 bluebird。但是它给了我下面的错误。

var expect = require('chai').expect;
var mongoose = require('mongoose');

var jobModel = require('../models/job');

var Promise = require('bluebird');

function resetJobs() {
  return new Promise(function(resolve, reject) {
    mongoose.connection.collections['jobs'].drop(resolve, reject);
  });
};

function findJobs(query) {
  return Promise.cast(mongoose.model('Job').find({}).exec());
};

var connectDB = Promise.promisify(mongoose.connect,mongoose);
describe('get jobs', function() {
  it('Should not be empty since jobs are seeded', function(done) {
    connectDB('mongodb://localhost/jobfinder').then(function() {
      resetJobs()
        .then(jobModel.seedJobs)
        .then(findJobs).then(function(jobList) {
          expect(jobList.length).to.be.at.least(1);
          done();
        });
    });
  });
});

但这给了我一个错误

Unhandled rejection TypeError: Cannot read property 'connection' of undefined
at Mongoose.connect (F:\MyProjects\JobFinder\node_modules\mongoose\lib\index.js:232:18)
at tryCatcher (F:\MyProjects\JobFinder\node_modules\bluebird\js\release\util.js:11:23)
at ret (eval at <anonymous> (F:\MyProjects\JobFinder\node_modules\bluebird\js\release\promisify.js:184:12), <anonymous>:14:23)
at Context.<anonymous> (F:\MyProjects\JobFinder\test\jobs-data-spec.js:22:3)

我使用的包版本如下

"bluebird": "^3.1.1",
"express": "^4.13.4",
"mongoose": "^4.3.6"

【问题讨论】:

  • 它似乎适用于以下代码var mongoose = require('mongoose'); var Promise = require('bluebird'); var connectDB = Promise.promisify(mongoose.connect, mongoose); console.log(connectDB);
  • 它仍然可以正常工作,var connectDB = Promise.promisify(mongoose.connect,mongoose); console.log(connectDB); 我猜你需要的mongoose 模块不正确...
  • @zangw 我正在使用的软件包版本也添加了。感谢您迄今为止提供的帮助
  • 我认为与版本无关。你可以通过console.log(mongoose);调试它来检查mongoose的值,因为错误显示no connect method of mongoose

标签: node.js mongoose mocha.js bluebird chai


【解决方案1】:

您也可以手动 promisify mongoose.connect,而不使用 bluebird:

const mongoose = require('mongoose');
const { promisify } = require('util');


const connectMongoose = promisify((resolve, reject) => {
    const options = { useNewUrlParser: true, useUnifiedTopology: true };
    const uri = 'mongodb+srv://<USERNAME>:<PASSWORD>' +
        '@cluster0.iz4o8.mongodb.net/<DB-NAME>?retryWrites=true&w=majority';
    try {
        mongoose.connect(uri, options, resolve);
    } catch (err) {
        reject(err);
    }
});


(async () => {
    try {
        await connectMongoose();
        console.log('connected to monoose! :)');
    }
    catch (err) {
        console.error('could not connect to mongoose :(', err);
        process.exit(-1);
    }
})();

【讨论】:

    【解决方案2】:

    以下代码似乎对我有用。

    var connectMongoose = Promise.promisify(mongoose.connect, {context: mongoose}); 
    connectMongoose('MONGO_URL', mongoose)
     .then(..)
    

    【讨论】:

      【解决方案3】:

      我也在编写相同的教程,这就是我为解决问题所做的工作。

      npm uninstall bluebird
      npm install --save bluebird@2.0
      

      然后,当您使用 mocha 运行测试时,您应该通过了。

      【讨论】:

        【解决方案4】:

        我正在编写相同的教程。
        Bluebird 将 3.0 中的 api 从 // 2.x Promise.promisify(fn, ctx); // 3.0 Promise.promisify(fn, {context: ctx});

        我进行了调用更改,调用停止抛出错误。

        请参阅此处了解 Bluebird 的解释: http://bluebirdjs.com/docs/new-in-bluebird-3.html

        希望对你有帮助

        【讨论】:

        • 谢谢 1+ 分享链接
        猜你喜欢
        • 2019-03-29
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 2012-11-14
        • 2021-08-26
        • 2021-09-20
        • 2015-06-16
        相关资源
        最近更新 更多