是否有一种“标准”的方式来组织/提升Express.js服务器?

时间:2018-06-18 21:38:33

标签: node.js typescript express

我对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类来提升应用程序。

1 个答案:

答案 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}`))