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 中的类型错误的主要内容,如果未能解决你的问题,请参考以下文章
如何在运行 Mongodb 的 Mongoose 中执行脚本?