我目前正在使用MySQL代替db而不是流行的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')
})
答案 0 :(得分: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:我不建议建立一个大型的,复杂的应用程序 - 将它拆分成较小的应用程序,其中我所呈现的模式很好地工作。答案 1 :(得分:0)
您可以将 Sequelize 用作MySQL数据库的 ORM(对象关系映射器),以使您的代码更具可读性,并允许您创建更好的应用结构。它还支持PostgreSQL,MySQL,MariaDB,SQLite和MSSQL。
有样品如何将Sequelize与Express集成。我不确定我是否允许在此发布github存储库,但现在是:
PS。我不拥有此存储库,但这可能会对您有所帮助。
答案 2 :(得分:0)
您可以在Angular 6项目中轻松地将sequelize与mysql和nodejs一起使用,我已经做了一个简单的项目,可以在其中获得全栈结构。
这是我的仓库的链接,您可以检查:https://github.com/azizijunaid/angular-full-stack-mysql-sequelizer