node.js - Nodejs express API 一个 sequelize(db) 实例到所有模型

标签 node.js mongodb express sequelize.js

我是 Nodejs 新手,从 udemy 类(class) https://www.udemy.com/api-development/learn/v4/content 学习 api 开发类(class)使用 mongodb(mongoose) 但我现在试图用 mongoose 替换 Sequelize
我试着详细解释这个问题。
我有一个文件 db.js

import mongoose from 'mongoose';
import config from './config';
export default callback => {
    let db = mongoose.connect(config.mongoUrl);
    callback(db);
}

我用 Sequelize 代替了它
import Sequelize from 'Sequelize';
import config from './config';

export default callback => {
    let db = new Sequelize(config.dbname, config.dbuser, config.dbpassword, {
      host: config.dbhost,
      dialect: 'mariadb',

      pool: {
        max: 5,
        min: 0,
        idle: 10000
      }
    });

    callback(db);

}

它接受这个 db 实例并将它传递给 routes.js 文件中的中间件和 Controller
import express from 'express';
import config from '../config';
import middleware from '../middleware';
import initializeDb from '../db';
import restaurant from '../controller/restaurant';

let router = express();

//connect to db
initializeDb(db => {

    //internal middleware
    router.use(middleware({config,db}));

    // api routes
    router.use('/restaurant',restaurant({config,db}));
});

export default router;

并在创建服务器时将此路由传递给 app.use
import http from 'http';
import express from 'express';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';

import config from './config';
import routes from './routes'; //her it imports the routes and pass it to app.use below

let app = express();
app.server = http.createServer(app);

// middleware
// parse application/json

app.use(bodyParser.json({
    limit:config.bodyLimit
}));


// passport config


//api routes v1
app.use('/v1',routes); //here it pass the routes

var listener = app.server.listen(config.port,function(){
    console.log(`Started on port ${listener.address().port}`);
});


export default app;

所以此时 db 实例现在可以在我的 Controller 上使用,方法如下:
这是 Controller 之一
import mongoose from 'mongoose';
import  { Router } from 'express';
import Restaurant from '../model/restaurant';

export default({config,db}) => {
    let api = Router();

    // '/v1/restaurant' - Read
    api.get('/',(req,res) => {
        // i have db available here
    }); 



    return api;
}

此时我需要模型中的 db 实例,所以我可以将它导入 Controller (将模型返回到 Controller ),而不是在 Controller import Restaurant from '../model/restaurant'; 中使用 db 实例,其中 Restaurant 将是 Sequelize 模型

但由于我在模型中没有可用的 db,一种方法是在模型文件中初始化 db,但我想如果有办法获取已初始化的 db 实例会更好,在 mongoose 中它使用模式生成模型,但对于 Sequelize 我需要有数据库实例才能创建模型,下面是 Mongoose 模型。
import mongoose from 'mongoose';
let Schema = mongoose.Schema;

let restaurantSchema = new Schema({
    name:String
});

module.exports = mongoose.model('Restaurant',restaurantSchema);

任何帮助将不胜感激,或者如果有更好的方法,请提出建议

最佳答案

查看最佳实践 here :

查看模型目录,它应该包含所有模型以及 index.js 文件,该文件用于实例化新的 sequelize 实例并将所有模型导入单个对象中。

现在,无论您在哪里需要与数据库交谈,您只需要做的就是:

var models  = require('../models');
models.User.create({ ... });

关于node.js - Nodejs express API 一个 sequelize(db) 实例到所有模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43446959/

相关文章:

javascript - NodeJS Postgres 错误 getaddrinfo ENOTFOUND

javascript - mongodb组和总和?

javascript - 为什么这个 node.js + mongoose 代码不保存到数据库中?

jQuery.ajax 发送 OPTIONS 和 POST,如何使用 Express.js (Node.js) 处理

mysql - 有效关联日志条目,例如失败的登录尝试

node.js - 使用类似操作符 inito MongoDB 的 Node JS Rest 服务

javascript - 在 Express 服务器上上传期间使用用户定义的名称重命名文件

javascript - 在函数调用之后放置数组有什么效果?

node.js - Gremlin 如何同时包含数字和字符串搜索

node.js - 用 Jest 方式模拟 Node 获取,创建一个用于模拟的响应对象