Promisifying Mongoose Connect 中的类型错误

Posted

技术标签:

【中文标题】Promisifying Mongoose Connect 中的类型错误【英文标题】:Type Error in Promisifying 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 【参考方案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+ 分享链接

以上是关于Promisifying Mongoose Connect 中的类型错误的主要内容,如果未能解决你的问题,请参考以下文章

mongoose--------ORM数据操作框架

如何在运行 Mongodb 的 Mongoose 中执行脚本?

在 Mongoose 中寻找更新的最佳方法

如何在 mongoose 或 mongodb 中制作数据模型

如何将创建的联系人分配给 Mongoose 中的当前用户?

在 Virtual Populate 中,如何定义 foreignField?