express - 使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

标签 express mongoose kraken.js

作品:

var mongoose = require('mongoose');

var db = function() {
  return {
    config: function(conf) {
      mongoose.connect('mongodb://' + conf.host + '/' + conf.database);
      var db = mongoose.connection;
      db.on('error', console.error.bind(console, 'connection error:'));
      db.once('open', function callback() {
        console.log('db connection open');
      });
    }
  };
};

module.exports = db();

不起作用:

var mongoose = require('mongoose');

var db = function() {
  return {
    config: function(conf) {
      var db = mongoose.createConnection('mongodb://' + conf.host + '/' + conf.database);
      db.on('error', console.error.bind(console, 'connection error:'));
      db.once('open', function callback() {
        console.log('db connection open');
      });
    }
  };
};

module.exports = db();

插入代码:

'use strict';


var mongoose = require('mongoose'),
User = mongoose.model('User'),
p = require('../lib/promise');

...
app.post('/user', function (req, res) {
  res.format({
    json: function () {
      //extract the user from the req
      try {
        var user = new User();
        user.firstName = req.body.firstName;
        user.lastName = req.body.lastName;
        user.userName = req.body.userName;
        user.password = req.body.password;
        user.email = req.body.email;

        user.save(function(err, data) {
        //omitted
...

最佳答案

不幸的是,这不是一个简单的重构。

1) .createConnection.connect

使用.createConnection时,您可以通过使用此调用创建的显式连接来访问模型。

这意味着您需要 User = db.model(...),而不是 User = mongoose.model(...)

示例( onetwothreefour )表明这并不复杂,但变化足够微妙,以至于 many people miss it 。文档对此也不是很清楚,这可能是根本原因。

2) 你的 kraken 应用程序和 .createConnection

如果您正在基于 kraken 示例之一进行构建,则需要进行一些更改。

  1. 更改 .createConnection 周围的代码,以便您可以访问返回的对象。在当前表单中,您将返回一个带有 config 函数的对象,但不会返回 .createConnection 生成的连接对象。
  2. 如果您更改 db.config 中配置/创建连接的方式,请更新 index.js。您也许可以避免这种情况,但我怀疑您将围绕新调用重写整个 db.js
  3. 确保使用模型的代码/ Controller 可以访问您的 .createConnection 返回的对象。这意味着既可以访问对象,也可以更改设置变量的任何位置,以便它使用 var xyz = db.model('XYZ') 等格式。

抱歉,没有简单的一行答案......

关于express - 使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22786374/

相关文章:

javascript - 打开 chrome 开发者工具时出现双重请求

node.js - Node.js 的 ntwitter 模块出错

node.js - express req.pipe() 不起作用

node.js - 如何防止 mongoose 中的字段更新

javascript - 在 Node.js 项目中连接多个 Mongo DB

node.js - 如何使用 Kraken.js 为 Bookshelf 配置 Knex

node.js - 如何在 sailsjs 中获取基本或根 url?

node.js - express-jwt 将用户对象设置为 req.user._doc 而不仅仅是 req.user?

node.js - KrakenJS Controller 路由

node.js - 使用 Phonegap 包装 nodejs 应用程序