我是相对较新的程序员。我目前正在尝试创建一个良好的代码库,然后可以从中开发所需的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
};