我对Node.js和JavaScript世界都很陌生,来自PHP环境。
我正面临着以下问题:许多PHP框架都在自行提升应用程序(即设置服务器,middlware,记录器,配置)的“繁重”工作。
在Express中,我在一个app.ts
(TypeScript示例)中“手动”执行此操作:
// Create schema and load configurations
import config from './config';
// Configure and load the logger
import logger from './logger';
// Create the Express.js server
// ...
// Configure global middlewares
app.use(morgan('tiny'));
app.use(compression());
app.use('/', express.static(`${__dirname}/../public`));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// Configure global routing
app.get('/', (req, res) => {
res.sendFile(`${__dirname}/../public/index.html`);
});
// Establish a connection to the database server
createConnection({
// options
}).then(() => {
// Start the web server
app.listen(/* options */);
});
这个文件(这里是一部分)变得太大了,我想分开它。在Node生态系统中有没有“标准”的方法呢?
以下方法是否有意义?
import * as express from 'express';
import config from './config';
import { Connection } from 'typeorm';
export class ServerConfigurer {
configureApp(app): void {
// Configure global middlewares
}
createConnection(): Promise<Connection> {
// Create MySQL connection
}
}
...然后在我的app.ts
使用ServerConfigurer
类来提升应用程序。
答案 0 :(得分:1)
在Express中,我在一个
中“手动”完成app.ts
几乎所有微框架都是这种情况,特别是Express。组织项目没有正确或错误的方法。
是否有一种“标准”方式来组织/提升Express.js服务器?
通常,您会发现许多示例都遵循MVC模式。例如,您通常会找到如下布局:
example
├── app.js
├── controllers/
├── models/
├── routes/
├── public/
└── views/
但是,Express主要用于构建API。现在,前端(views/
和public/
文件夹)通常是一个React,Vue或Angular应用程序,它是自己的项目,单独来自你的Express API。话虽如此,典型的 Express API项目布局将是:
example
├── app.js
├── controllers/
├── models/
└── routes/
app.js
是所有事情的所有初始化发生的地方。通过初始化,我的意思是安装路由,中间件,数据库连接,事件监听器......真的。 app.js
是Express应用程序的主要/第一个入口点。
models/
是您定义所有数据库模型的地方(通常 Mongo)。例如:
// models/contact.js
const mongoose = require('mongoose');
const definition = {
name: {
type: String,
trim: true,
required: true,
}
};
const schema = new mongoose.Schema(definition, { timestamps: true });
module.exports = mongoose.model('Contact', schema);
controllers/
是所有路由处理程序的所在。例如:
// controllers/contact.js
const Contact = require('../models/contact');
exports.index = async (req, res) => {
const contacts = await Contact.find().exec();
res.json({
status: 200,
data: contacts,
});
};
最后我们有routes/
,您可以在其中定义所有路径并安装/映射控制器。例如:
// routes/contact.js
const express = require('express');
const contactController = require('../controllers/contact');
const router = express.Router();
router.get('/', contactController.index);
module.exports = router;
最后,我们需要将所有内容连接在一起:
const express = require('express');
const mongoose = require('mongoose');
const contactRoutes = require('./routes/contact');
const app = express();
// Connect to mongo.
mongoose.connect(process.env.MONGO_URI);
// Fail on connection error since we need the database.
mongoose.connection.on('error', error => { throw error; });
// Allows parsing the body content via `req.body`
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// Mount API routes.
app.use('/contacts', contactRoutes);
app.listen(process.env.NODE_PORT, () => console.log(`Listening on ${process.env.NODE_PORT}`))