【问题标题】:Best practices for MySQL + Node/Express + Angular StackMySQL + Node/Express + Angular Stack 的最佳实践
【发布时间】:2018-08-12 17:58:15
【问题描述】:

我目前在数据库中使用 MySQL 而不是流行的 mongodb,因为在这种情况下,就架构和设置而言,没有太多文档。这是我目前的结构

client
-- angular files
routes
-- index.js
views
-- 404 page
app.js

我不明白如何在这个结构中实现控制器或模型。我目前正在从数据库中获取数据或将其与路由一起发送。我不确定添加的控制器层会做什么。也许这是一个愚蠢的问题,但我只想有一个明确的基线,以便我的项目能够很好地扩展。我觉得应该比我目前拥有的更多。

index.js

const express = require('express');
const mysql = require('mysql');
const router = express.Router();

const db = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'password',
    database : 'db'
});

// Connect
db.connect((err) => {
    if(err){
        throw err;
    }
    console.log('MySql Connected...');
});

// Select Data
router.get('/getData', (req, res) => {
    let sql = 'SELECT * FROM data';
    let query = db.query(sql, (err, results) => {
        if(err) throw err;
        console.log(results);
        res.send(results)
    });
});

module.exports = router;

app.js

const express = require('express');
const mysql = require('mysql');
const bodyParser = require('body-parser');
const path = require('path');
const cors = require('cors');
const compression = require('compression');
const helmet = require('helmet')
const expressSanitizer = require('express-sanitizer');

const index = require('./routes/index');

const app = express();
const port = 3000;

var corsOptions = {
    origin: 'http://localhost:8100',
    optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204 
}

// var logger = (req, res, next) => {
//     console.log('logging...')
//     next();
// }

//added security
app.use(helmet())

// //set logger
// app.use(logger)

//cors options
app.use(cors(corsOptions))

//body parser middleware
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: false}))

// Mount express-sanitizer here
app.use(expressSanitizer()); // this line follows bodyParser() instantiations

//set static path
app.use(express.static(path.join(__dirname, 'client')));

// set our default template engine to "ejs"
// which prevents the need for using file extensions
app.set('view engine', 'ejs');

//gzip compression
app.use(compression())

//set views for error and 404 pages
app.set('views', path.join(__dirname, 'views'));

app.use('/', index);
app.use('/fp/trips', trips);

app.listen(port, () => {
    console.log('server started on port 3000')
})

【问题讨论】:

  • there isn't much documentation out there ...这是选择关系数据库而不是非关系数据库的相对不好的理由。 MySQL 和 Mongo 做的事情非常不同。您在这里有什么数据需求?至于您的实际问题,如果您仍然无法让 MySQL 与 Node 一起工作,这在许多地方都有大量文档,那么您通常可能会遇到学习曲线问题。
  • 就选择关系到非关系而言,我真的没有选择。就让它发挥作用而言,它确实有效——我只是觉得我在这里遗漏了一些东西。

标签: mysql node.js express


【解决方案1】:

在开发 Node 应用程序时,我倾向于采用控制器(几乎)是服务的方案——我认为它非常适合小型应用程序。

这是一个例子:

index.js

let app = express()
let users = require('./services/users')

app.get('/users/:id', async function(req, res, next) => {
  try {
    res.json(users.getByid(req.params.id))
  } catch() {
    next(err)
  }
})

app.listen(8080)

服务/users.js

let db = require('./db')

async function getById(id) {
  let conn = await db.connect()
  let user = conn.query('SELECT * FROM user WHERE id = ?', [id])

  if (!user) {
    throw new Error("404")
  }

  return user
}

module.exports = {getById}

服务/db.js

let realDb = require('some-open-source-library-to-interact-with-db')
realDb.initialize(process.env.DB_CREDENTIALS) // pseudo-code here

module.exports = realDb

但是,当您构建大型、复杂的应用程序时,这将无法正常工作——我认为在这种情况下您将需要更多的结构。

PS:我不建议构建一个大型、复杂的应用程序——将它拆分成更小的应用程序,像我介绍的那样运行良好。

【讨论】:

  • 太棒了!我很感激!
【解决方案2】:

您可以将 Sequelize 用作 MySQL 数据库的 ORM(对象关系映射器),以使您的代码更具可读性并允许您创建更好的应用程序结构。它还支持 PostgreSQL、MySQL、MariaDB、SQLite 和 MSSQL。

有一些示例如何将 Sequelize 与 Express 集成。我不确定我是否可以在这里发布一个 github 存储库,但这里是:

https://github.com/jpotts18/mean-stack-relational

PS。我不拥有此存储库,但这可能会对您有所帮助。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2018-09-05
    • 2012-03-17
    相关资源
    最近更新 更多