Есть ли лучший способ структурировать экспресс-точку входа? - PullRequest
0 голосов
/ 09 июня 2019

Я относительно новый программист. В настоящее время я пытаюсь создать хорошую базу кода, из которой я могу затем разработать API, который мне нужен. Для этого необходимо, чтобы я использовал NodeJS с Express и TypeScript. Итак, я создал новый проект начальной загрузки с экспресс-генератором и начал преобразовывать код в структуру соответствия TypeScript.

Мой вопрос начинается здесь: Я переместил и переименовал файл «root / bin / www» в «src / bin / index.ts». Мой tslint установлен на «рекомендуемый», и поэтому «переменная без тени» - это правда Итак, я получил ошибку «no-shadowed-variable» в моем index.ts, потому что переменная port определяется дважды. Однажды во внешней функции, а также в функции "onListening". Поэтому я начал разделять функции «onListening» и «onError» в новый модуль с именем «expressHandlers.ts», а функцию «normalizePort» - в «normalizePort.ts».

Вы можете увидеть полную структуру проекта на: https://github.com/owme/server-template/tree/master/src/bin

В данный момент он работает, но не могли бы вы сообщить мне, если вы считаете, что такой подход к переименованию и модульности bin / www является разумным?

Btw. Мне пришлось переписать части функции "onListening", потому что addr может иметь тип AddressInfo | строка | ноль. И ноль не является допустимой записью переменной.

Итак, мой index.ts теперь экспортирует две переменные {порт, сервер}, чтобы они были доступны для normalizePort. В index.ts осталось следующее:


index.ts:

#!/usr/bin/env node
'use strict';

/**
 * Module dependencies.
 * @private
 */

import { createServer } from 'http';
import app, { set } from '../app';
import { onError, onListening } from './expressHandlers';
import { normalizePort } from './normalizePort';

/**
 * Get port from environment and store in Express.
 */

const port = normalizePort(process.env.PORT || '3000');
set('port', port);

/**
 * Create HTTP server.
 */

const server = createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Module exports.
 * @public
 */

export {
  port,
  server
};

normalizePort.ts:

'use strict';

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val: number|string): number|string|boolean {
  const port: number = (typeof val === 'string') ? parseInt(val, 10) : val;

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Module exports.
 * @public
 */

export {
  normalizePort
};

expressHandler:

'use strict';

/**
 * Module dependencies.
 * @private
 */

import debug from 'debug';
debug('server:server');
import {
  port,
  server
} from './index';

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error: NodeJS.ErrnoException) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  const bind = (typeof port === 'string') ? `Pipe ${port}` : `Port ${port}`;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      debug(`${bind} requires elevated privileges`);
      process.exit(1);
      break;
    case 'EADDRINUSE':
      debug(`${bind} is already in use`);
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  const addr = server.address();
  let bind = null;
  if (addr !== null) {
    if (typeof addr === 'string') {
      bind = `pipe ${addr}`;
    } else {
      bind = `port ${addr.port}`;
    }
  } else {
    throw new Error('The Host-Address is null');
  }
  debug(`Listening on ${bind}`);
}

/**
 * Module exports.
 * @public
 */

export {
  onError,
  onListening
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...