请求未被处理

问题描述

我目前正在尝试了解有关 Express 和 Express-Validator 的更多信息,但目前面临以下问题:当我启动服务器并使用 Postman 执行过多的端点时,响应未完成。但是,似乎正在处理验证链,但之后没有任何反应。我有以下模块:

index.ts

import {config} from 'dotenv';
import App from './api/app';
import ControlAmbilight from './api/routes/controlAmbilight';
import AdjustLightning from './app/AdjustLightning';

const ENV_FILE = path.join(__dirname,'..','.env');
config({path: ENV_FILE});

const PORT = process.env.port || process.env.PORT || 3000;

const ambient = new AdjustLightning();

const app = new App([
  new ControlAmbilight(ambient),],<number> PORT);

app.listen();

app.ts

import * as bodyParser from 'body-parser';
import pino from 'pino';
import expresspino from 'express-pino-logger';
import errorMiddleware from './middleware/errorMiddleware';

export default class App {
    private logger: pino.Logger;
    private expressLogger;
    public app: express.Application;
    public port: number;

    constructor(controllers: any,port: number) {
      this.app = express();
      this.port = port;

      this.logger = pino({level: process.env.LOG_LEVEL || 'info'});
      this.expressLogger = expresspino({logger: this.logger});
      this.initializeMiddlewares();
      this.initializeControllers(controllers);
      this.initializeErrorHandling();
    }

    private initializeMiddlewares() {
      this.app.use(this.expressLogger);
      this.app.use(bodyParser.json());
    }

    private initializeControllers(controllers: any) {
      controllers.forEach((controller: any) => {
        this.app.use('/',controller.router);
      });
    }

    private initializeErrorHandling() {
      this.app.use(errorMiddleware)
    }

    public listen() {
      this.app.listen(this.port,() => {
        this.logger.info(`Server running on ${this.port}`);
      });
    }
}

controlAmbilight.ts

import {Router,Request,Response,NextFunction} from 'express';
import {ValidationChain,check,validationResult} from 'express-validator';
import AdjustLightning from '../../app/AdjustLightning';

// eslint-disable-next-line require-jsdoc
export default class ControlAmbilight {
    private ambient: AdjustLightning;
    // eslint-disable-next-line new-cap
    public router = Router();
    public path = '/controlAmbilight';

    // eslint-disable-next-line require-jsdoc
    constructor(ambient: AdjustLightning) {
      this.ambient = ambient;
      this.initializeRoutes();
    }

    // eslint-disable-next-line require-jsdoc
    public initializeRoutes() {
      this.router.post(this.path,this.controlValidator,this.setAmbilight.bind(this));
    }

  private controlValidator = (): ValidationChain[] => [
    check('on').notEmpty().withMessage('Field \'on\' is required'),check('on').isBoolean().withMessage('Field \'on\' must be type boolean'),];

  // eslint-disable-next-line require-jsdoc
  private setAmbilight(req: Request,res: Response): void {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      res.status(422).json({error: errors.array()});
    } else {
      const isOn = (req.body.on == 'true');

      res.send(`The curent state is: ${this.ambient.getIsActive()}`);
    }
  }
}

我希望有人可以向我解释我在这里遗漏了什么。好像需要调用express`next()中间件函数,但是不知道在哪里实现。

编辑 根据要求,我正在添加 errorMiddleware:

import { NextFunction,Response } from 'express';
import HttpException from '../exceptions/HttpException';

export default function errorMiddleware (error: HttpException,request: Request,response: Response,next: NextFunction) {
    const status = error.status || 500;
    const message = error.message || 'Ups... This did not work :(';
    response
        .status(status)
        .send({ status,message });
}

作为附加评论:当我将验证链直接添加controlAmbilight.ts 内的 post 方法时:

public initializeRoutes() {
      this.router.post(this.path,[
        check('on').notEmpty().withMessage('Field \'on\' is required'),this.setAmbilight.bind(this));
}

它按预期工作。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)