有没有更好的方法来构造快速入口点?

时间:2019-06-09 15:56:54

标签: node.js typescript express

我是相对较新的程序员。我目前正在尝试创建一个良好的代码库,然后可以从中开发所需的API。要求是,我想将NodeJS与Express和TypeScript一起使用。因此,我用express-generator创建了一个新的express bootstrapped项目,并开始将代码转换为TypeScript一致性结构。

我的问题从这里开始: 我将“ root / bin / www”文件移动并重命名为“ src / bin / index.ts”。我的tslint设置为“推荐”,因此“无阴影变量”为真。因此,在index.ts中出现了“无阴影变量”错误,因为变量端口被定义了两次。一旦在外部函数以及“ onListening”函数中。因此,我开始将“ onListening”和“ onError”功能分为一个名为“ expressHandlers.ts”的新模块,并将“ normalizePort”功能分为“ normalizePort.ts”。

您可以在以下位置查看完整的项目结构: https://github.com/owme/server-template/tree/master/src/bin

它目前正在运行,但是如果您认为这种对bin / www进行重命名和模块化的方法合理吗?

顺便说一句。我必须重写“ onListening”函数的某些部分,因为addr的类型可以是AddressInfo |字符串空值。而且null不是变量的有效条目。

因此,我的index.ts现在导出两个变量{port,server}可用于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
};

0 个答案:

没有答案