Erro com o mongo DB usando o mongoose. #nodejs #aplicaçõesWebReal-timeComNode.js

Alguem pode me ajudar? Capítulo 7 do livro: Aplicações Web Real-time com Node.js.

Como se o script estivesse lendo o models antes de abrir a conexão – o que não deveria ser um problema visto do mongoose – e não encontra o método model().

Aparentemente não está abrindo a conexão. Já experimentei outro script e funcionou – com o tratamento de erro, caso não se conectasse –, porém, se deveria aparecer o DB no mongo só de abrir uma conexão, não está aparecendo.

Repito o detalhe: não aparece a db ‘ntalk’ no mongodb:

mongo
show dbs


Meu terminal:

ntalk@0.0.1 start
node app.js

/Library/WebServer/Documents/node-estudos/ntalk/app.js:38
db.model(‘usuarios’, usuario);
^

TypeError: db.model is not a function
at Object. (/Library/WebServer/Documents/node-estudos/ntalk/app.js:38:8)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions…js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47


app.js

const express = require('express');
const path = require('path');
const http = require('http');
const socketIo = require('socket.io');
const consign = require('consign');
const bodyParser = require('body-parser');
const cookie = require('cookie');
const expressSession = require('express-session');
const methodOverride = require('method-override');
const mongoose = require('mongoose');
const bluebird = require('bluebird');
const config = require('./config');
const error = require('./middlewares/error');

mongoose.Promise = bluebird;
global.db = mongoose.connect('mongodb://127.0.0.1:27017/ntalk');


const app = express();
const server = http.Server(app);
const io = socketIo(server);
const store = new expressSession.MemoryStore();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(expressSession({
  store,
  name: config.sessionKey,
  secret: config.sessionSecret
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(methodOverride('_method'));
app.use(express.static(path.join(__dirname, 'public')));

io.use((socket, next) => {
  const cookieData = socket.request.headers.cookie;
  const cookieObj = cookie.parse(cookieData);
  const sessionHash = cookieObj[config.sessionKey] || '';
  const sessionId = sessionHash.split('.')[0].slice(2);
  store.all((err, sessions) => {
    const currentSession = sessions[sessionId];
    if (err || !currentSession) {
      return next(new Error('Acesso negado!'));
    }
    socket.handshake.session = currentSession;
    return next();
  });
});

consign({})
  .include('models')
  .then('controllers')
  .then('routes')
  .then('events')
  .into(app, io)
;

app.use(error.notFound);
app.use(error.serverError);

server.listen(3000, () => console.log('Ntalk no ar'));

usuario.js (models)

const Schema = require("mongoose").Schema;

module.exports = () => {
    const contato = Schema({
        nome: String,
        email: String
    });
    const usuario = Schema({
        nome: {
            type: String,
            required: true
        },
        email: {
            type: String,
            required: true,
            index: {unique: true}
        },
        contatos: [contato]
    });
    return db.model('usuarios', usuario);
}