Я относительно новый программист. В настоящее время я пытаюсь создать хорошую базу кода, из которой я могу затем разработать 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
};