使用Node.js和Oracle数据库创建REST API

哈Ha! 我向您介绍了文章“创建REST API:Web服务器基础知识”的翻译

第1部分:创建REST API:Web服务器基础


Web服务器是REST API最重要的组件之一。 在本文中,您将通过创建一些初始目录和文件来开始REST API项目。 然后,您将创建一个Web服务器模块并将其插入,以便Web服务器正确启动和关闭。

该项目中的代码将使用通用的目录结构进行组织,可以根据需要随时进行调整和构建。

cd ~ mkdir hr_app cd hr_app/ touch index.js mkdir config touch config/web-server.js mkdir controllers mkdir db_apis mkdir services touch services/web-server.js 

index.js文件可以视为应用程序中的“主”文件。 这将是应用程序的入口。 我们将代码添加到config和services目录中的该文件和web-server.js文件中。

将以下代码粘贴到文件Home> hr_app> config> web-server.js中

 module.exports = { port: process.env.HTTP_PORT || 3000 }; 

在Node.js中,流程对象具有包含用户环境的env属性。 我使用它来将端口值设置为HTTP_PORT环境变量的值。 如果未定义此环境变量,则默认值为3000。

将以下代码粘贴到Home> hr_app> services> web-server.js文件中

 const http = require('http'); const express = require('express'); const webServerConfig = require('../config/web-server.js'); let httpServer; function initialize() { return new Promise((resolve, reject) => { const app = express(); httpServer = http.createServer(app); app.get('/', (req, res) => { res.end('Hello World!'); }); httpServer.listen(webServerConfig.port) .on('listening', () => { console.log(`Web server listening on localhost:${webServerConfig.port}`); resolve(); }) .on('error', err => { reject(err); }); }); } module.exports.initialize = initialize; 

第1-3行:需要多个模块。 http模块包含在Node.js中,但是Express模块​​将需要通过npm安装。

第7-27行:声明了一个名为initialize 函数。 该函数立即返回一个promise,根据Web服务器是否成功启动,该promise是允许还是拒绝。

第9-10行:创建了一个新的express应用程序(实际上只是一个函数),然后用于通过http模块创建一个http服务器。

第12-14行:应用程序 get方法用于为到达根路径(/)的GET请求添加处理程序。 收到此类请求后,将调用回调函数,并将使用“ res”(res)参数发送响应“ Hello World!”。 给客户。

第16-24行:服务器侦听方法用于绑定到指定的端口并开始侦听传入的请求。

第28行:导出模块,以便可以在外部使用

将以下代码粘贴到文件Home> hr_app> index.js中

 const webServer = require('./services/web-server.js'); async function startup() { console.log('Starting application'); try { console.log('Initializing web server module'); await webServer.initialize(); } catch (err) { console.error(err); process.exit(1); // Non-zero failure code } } startup(); 

我们连接Web服务器模块,然后它确定并调用异步启动功能。 由于Web服务器的initialize函数返回一个promise,因此可以将其与async / await一起使用,并将其包装在try-catch块中。 如果初始化功能成功,则Web服务器将工作; 否则,任何异常都将被捕获并处理。 现在您要做的就是初始化npm并安装Express-然后就可以启动应用程序了。 在hr_app目录的终端中运行以下命令。

 npm init -y npm install express -s node . 

npm init命令用于创建package.json文件,npm将该文件用作清单文件(-y标志接受默认选项)。 npm install命令用于安装express(-s标志将express添加到package.json中的依赖项列表)。 Npm将您安装的模块存储在node_modules目录中。 他还创建了一个名为package.lock.json的文件,为开发团队提供了相同的树。

您是否看到消息Web服务器正在localhost上侦听:3000? 恭喜,您已创建基于的快递服务器!

他在这里,是另一个“你好世界”。 尽管不是特别有趣,但这对于您的API来说是重要的第一步。

准备就绪后,可以通过返回终端并按ctrl + c来关闭服务器。

图片

受控关机


在关闭期间,通过按Ctrl + C组合键,您无法控制这种情况的发生。 要控制关闭过程,您需要显式关闭Web服务器并退出Node.js进程。

将以下代码粘贴到Home> hr_app> services> web-server.js文件中

 // *** previous code above this line *** function close() { return new Promise((resolve, reject) => { httpServer.close((err) => { if (err) { reject(err); return; } resolve(); }); }); } module.exports.close = close; 

当Web服务器成功关闭时,close函数将返回一个promise。 httpServer.close方法停止建立新的连接,但是不强制关闭已经打开的连接。 根据打开的连接数和正在执行的操作,您可能需要稍等片刻,直到回调起作用。 尽管您不会在此模块中执行此操作,但是可以使用自定义代码或npm模块(例如http-shutdown)来强制打开打开的连接。

将以下代码粘贴到文件Home> hr_app> index.js中

 // *** previous code above this line *** async function shutdown(e) { let err = e; console.log('Shutting down'); try { console.log('Closing web server module'); await webServer.close(); } catch (e) { console.log('Encountered error', e); err = err || e; } console.log('Exiting process'); if (err) { process.exit(1); // Non-zero failure code } else { process.exit(0); } } process.on('SIGTERM', () => { console.log('Received SIGTERM'); shutdown(); }); process.on('SIGINT', () => { console.log('Received SIGINT'); shutdown(); }); process.on('uncaughtException', err => { console.log('Uncaught exception'); console.error(err); shutdown(err); }); 

SIGINT和SIGTERM事件与可以发送到进程以将其关闭的信号相关,例如,按下ctrl + c时。 当抛出JavaScript错误但未捕获并使用try-catch语句处理时,将发生uncaughtException事件。 尝试再次启动和关闭该应用程序。 当您在终端中看到“ shutdown”消息时,您会发现一切正常。

在服务器上注册


还有另一件事可以完善我们的Web服务器模块:HTTP日志记录。 您可以使用多种模块来进行这种类型的登录,但是morgan是其中一种简单的模块。 让我们使用npm安装morgan。

 npm install morgan -s 

然后将以下行添加到services / web-server.js中需要express的行(第2行):

 const morgan = require('morgan'); 

现在,您可以将morgan功能启用为中间件,通过该中间件将使用app.use处理所有请求。 在调用app.get之前添加此行,该消息显示消息“ hello world”。

 // Combines logging info from request and response app.use(morgan('combined')); // *** app.get call below this line *** 

请注意,app.use创建了可以与HTTP请求和响应进行交互的中间件功能的管道。 中间件功能将按启用顺序执行。 重新启动该应用程序并安装终端,以便您可以同时看到它和浏览器。 每次重新加载页面时,您都应该在终端中看到一个新的日志条目。 默认情况下,morgan将日志信息传递到STDOUT(在终端中显示)。

以下文章将介绍使用数据库(包括连接池)的基础知识,这些数据库将帮助您了解和构建用于Node.js的REST API。

Source: https://habr.com/ru/post/zh-CN473234/


All Articles