在猫鼬的节点JS Express应用中使用多个数据库

时间:2019-07-12 01:25:27

标签: node.js express mongoose

我有一个NodeJS应用程序,当前使用单个mongo数据库,但是我发现自己需要获取辅助数据库中的数据。 两个数据库都在同一群集上。项目结构如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= title %>></title>
    <link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.47.0/mapbox-gl.js'></script>
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.47.0/mapbox-gl.css' rel='stylesheet' />
    <link rel="stylesheet" href="stylesheets/post-show.css">

</head>
<body>
    <% include ../partials/navbar %>
    <% include ../partials/flash-message %>
    <%-body -%>



</body>
</html>

在app.js中,我一直使用 app.js models --Book.js --School.js --Class.js --User.js routes --adoptions.js views --handlebars files ,但我知道这基本上是将猫鼬连接与全局连接“映射”,所以我要使用的是mongoose.connect()。 我发现的所有问题和答案在同一文件中都有模型和连接对象,但是在我的项目中它们在不同的文件中。 另一个问题是,在不同的数据库上模型并不相同:Database1仅具有一个用户集合,Database2具有Book,School和Class。

即使在routes文件中定义了连接对象,我仍在努力从第二个数据库中检索数据。我试着放:

mongoose.createConnection()

在我的options.js文件中,但是当我对其中任何一个执行var conn = mongoose.createConnection('connectionStringToDatabase2', {useNewUrlParser: true}); const Class = conn.model('class'); const Book = conn.model('book'); const School = conn.model('school'); 查询时,即使知道它们包含数据,我也会得到一个空数组。

我的模型文件如下:

find()

和其他模式遵循相同的结构。

如何在保持项目结构的同时使用辅助连接?我真的不想拥有一个包含所有内容的大文件,而且我知道我在这里丢失了一些东西

1 个答案:

答案 0 :(得分:0)

因此,经过大量实验,我设法回答了自己的问题:

我在配置文件夹中创建一个新的database.js文件,如下所示:

database.js

const mongoose = require('mongoose');

let conn = mongoose.createConnection('connectionStringToSecondaryDb', {useNewUrlParser: true});

module.exports = conn;

然后,在文档中所说的每个仅在第二个数据库中定义的模型中需要该文件,所以:

Book.js

const mongoose = require('mongoose')
const conn = require('../config/database');
const Schema = mongoose.Schema;

//Create Schema
const BookSchema = new Schema({
    //Various schema stuff
}, { _id: false });

//Note here we are using the secondary conn object to model this schema
conn.model('book', BookSchema, 'book');

完成此操作后,您现在只需要在routes文件中建立辅助连接,即可像正常使用模型:

SectionRoute.js

const express = require('express');
const router = express.Router();
const mongoose = require('../config/database');
require('../models/Book');

const Book = mongoose.model('book');

//Do normal mongoose use in your route file (Book.find(), Book.save, ecc ecc)

注意:在路由部分中,我仍在使用mongoose.model,因为我已将该文件的mongoose常量设置为database.js传递的连接,因此它没有使用全局mongoose.connection对象!

希望这对其他人也有帮助!