首页 文章

Nodejs向所有模型表达API一个sequelize(db)实例

提问于
浏览
0

我是Nodejs的新手,从udemy课程学习api开发 https://www.udemy.com/api-development/learn/v4/content 课程使用mongodb(mongoose)但我现在正试图用 Sequelize 取代 mongoose

我试着详细解释这个问题 . 我有一个文件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文件中的中间件和控制器

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;

所以此时数据库实例现在可以在我的控制器上使用,这里是如何:这是控制器之一

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实例,所以我可以在控制器中导入它(返回模型到控制器)而不是在控制器中使用db实例 import Restaurant from '../model/restaurant'; 其中 Restaurant 将是sequelize model

但由于我没有在模型中使用db,一种方法是在模型文件中初始化db,但是我想如果有办法获得已经初始化的db实例它会更好,在 mongoose 它使用模式生成模型但是sequelize我需要有db实例才能创建模型,下面是mongoose模型 .

import mongoose from 'mongoose';
let Schema = mongoose.Schema;

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

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

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

1 回答

  • 0

    查看最佳实践here

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

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

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

相关问题