【问题标题】:Mongoose model.save() stuck pending?Mongoose model.save() 卡住了?
【发布时间】:2018-05-22 03:40:43
【问题描述】:

我正在使用 mongoose 通过 MongoDB 处理我的模式,但是当尝试将新条目保存到集合时,save() 方法似乎被卡住了,then() 方法或 catch() 方法promise 似乎被调用了。

有人有什么想法吗?

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// const Promise = require('bluebird');

const config = require('./config');

const UserSchema = new Schema({
    email: { type: String, required: true, index: { unique: true } },   
    name: { type: String, required: false },
    password: { type: String, required: true }
});

const User = mongoose.model('User', UserSchema);

console.log('config.database.url', config.database.url);

mongoose.Promise = global.Promise;
return mongoose.createConnection(config.database.url, {
    useMongoClient: true
})
.then((connection) => {
    const user = new User({
        email: 'someuser@somedomain.com',
        password: 'xxxxx'
    });

    const prom = user.save();

    // Displays: 'promise: Promise { <pending> }'
    console.log('promise:', prom);

    return prom
    .then((result) => {
        // Don't see this output
        console.log('result:', result);
    })
    .catch((error) => {
        // Don't see this output either
        console.log('error:', error);
    });
})
.catch((error) => {
    console.log(error);
});

环境:nodejs 8.9.0,节点模块:Mongoose 4.13.6,mongodb 2.2.33

【问题讨论】:

  • 有一个回调来保存方法和控制台错误参数来知道什么是错的。另外return prom 基本上是在终止你的函数,所以它明显的剩余代码没有执行
  • 我认为 pending 的事情没有任何问题。毕竟是异步代码,console.log 在保存完成之前被调用。您可以将createConnection 更改为connect 以使其保存。

标签: node.js mongoose


【解决方案1】:

多做一些实验,看来我需要确保模型与连接相关联,这样:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// const Promise = require('bluebird');

const config = require('./config');

const UserSchema = new Schema({
    email: { type: String, required: true, index: { unique: true } },   
    name: { type: String, required: false },
    password: { type: String, required: true }
});

let User;

console.log('config.database.url', config.database.url);

mongoose.Promise = global.Promise;

return mongoose.createConnection(config.database.url, {
    useMongoClient: true
})
.then((connection) => {
    // associate model with connection
    User = connection.model('User', UserSchema);

    const user = new User({
        email: 'someuser@somedomain.com',
        password: 'xxxxx'
    });

    const prom = user.save();

    // Displays: 'promise: Promise { <pending> }'
    console.log('promise:', prom);

    return prom
    .then((result) => {
        // Don't see this output
        console.log('result:', result);
    })
    .catch((error) => {
        // Don't see this output either
        console.log('error:', error);
    });
})
.catch((error) => {
    console.log(error);
});

或者,我们应该使用connect() 方法,该方法将与通过mongoose.model 关联的模型一起使用。

createConnection() 可用于创建多个连接,因此据我所知,不支持使用“全局”模型。

如果save() 不直接屏蔽就好了。

注意:在研究我的答案的改进时,我发现了以下内容:Queries hang when using mongoose.createConnection() vs mongoose.connect()

【讨论】:

    猜你喜欢
    • 2012-06-23
    • 2021-10-08
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多