JobbyM's Blog

[译]NodeJS 入门

特别声明:此篇文章内容来源于@Aditya SridharHow to use NodeJS without frameworks and external libraries

NodeJS最常用于Express 框架。许多其他外部库也使用了NodeJS。

这些框架和库与NodeJS 一起使用的原因是使开发更容易,更快捷。

在处理任何实际项目时,最好在需要时使用框架和库来实现更快的开发😄

也就是说,在这篇文章中,我将展示如何在不使用Express 框架或任何其他外部库的情况下使用NodeJS 构建简单REST API。本文仅使用NodeJS 本身提供的那些功能。

这样做的原因是为了展示NodeJS 如何在没有框架和库的情况下使用😄。这也将更好地了解NodeJS 的工作原理

前期准备

按照https://nodejs.org 安装NodeJS。

代码

我的github 仓库中提供了本文的代码。

从代码开始😄

创建一个名为simple-rest-apis-nodejs-without-frameworks 的文件夹。 这将是我们的NodeJS 项目文件夹。

进入项目文件夹并使用npm init 将项目转换为NodeJS 项目。执行此操作的命令是

1
2
cd simple-rest-apis-nodejs-without-frameworks
npm init

package.json

运行npm init 后,将在项目文件夹中创建package.json 文件。

package.json 包含有关项目的信息,如项目名称,版本,描述等。另外,package.json 是添加Node 依赖项的地方。在本文中,我们不会有任何依赖关系,因为我们只使用NodeJS 本身提供的功能。

第一个API

server.js

在项目文件夹中创建一个名为server.js 的文件。这将是我们应用的起点。

将以下代码复制到server.js

1
2
3
4
5
6
7
8
const hostname = '127.0.0.1'
const port = 3000

const server = require('./controller.js')

server.listen(port, hostname, () => {
console.log(`Server running at https://${hostname}:${port}/`)
})

这段代码实际上依赖于一个名为controller.js 的文件,我们将很快添加它。 此代码告诉服务器需要侦听localhost 上的3000 端口

服务器创建在controller.js 中完成

controller

这是我们将创建服务器并定义其余端点的文件。创建一个名为controller.js 的文件

让我们先在controller.js 中创建一个GET 端点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const http = require('http')
const url = require('url')

module.exports = http.createServer((req, res) => {

var service = require('./service.js')
const reqUrl = req.parse(req.url, true)

// GET Endpoint
if (reqUrl.pathname == '/sample' && req.method === 'GET') {
console.log('Request Type: ' +
req.method + ' Endpoint: ' +
reqUrl.pathname)

service.sampleRequest(req, res)
}
})

首先导入httpurl 模块。这些模块由NodeJS 本身提供。

http 模块可以创建Web 应用程序。它支持客户端和服务器操作。

url 模块用于解析网址

http.createServer((req, res) => { 表示需要创建一个http 服务器,其请求为req,响应为res

module.exports 用于将此文件导出为模块。这就是我们可以使用const server = require('./controller.js')server.js 中导入controller.js 的原因

可以看出,这个文件需要service.js,我们稍后会讨论。

代码const reqUrl = req.parse(req.url, true) 获取请求url 并解析它,以便我们可以在其上运行一些url 函数。

我们要创建的第一个端点是一个GET 端点,端点url/sample

为了进行url 路由,我们将使用if else条件

if (reqUrl.pathname == '/sample' && req.method === 'GET') { 检查请求的url 是否为/sample,并检查请求类型是否为GET

get 请求的逻辑出现在service.sampleRequest(req, res)中,是service.js 中定义的函数

service.js

这是实际的api 逻辑将存在的地方。创建一个名为service.js 的文件。

将以下代码复制到service.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const url = require('url')

exports.sampleRequest = function (req, res) {
const reqUrl = url.parse(req.url, true)
var name = 'World'
if (reqUrl.query.name) {
name = reqUrl.query.name
}

var response = {
'text': 'Hello ' + name
}

res.statusCode = 200
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify(response))
}

此代码检查请求URL 是否具有名为name 的查询参数,并将其存储在name 变量中。如果不存在查询参数,则默认为字符串World

响应状态设置为200,响应的内容类型为JSON,最后使用res.end(JSON.stringify(response)) 返回响应

因为响应变量 是一个JSON 对象,我们在它上面使用JSON.stringify 将它转换为字符串,然后再发回http 响应

现在我们可以使用该命令运行应用程序

1
node server.js

Testing

为了测试端点使用postman。你可以在这里下载

postman 中选择Get 请求并输入URLhttp://localhost:3000/sample?name=aditya 并点击发送

此请求的输出如下所示

1
2
3
{
'text': 'Hello aditya'
}

现在输入网址为http://localhost:3000/sample 并点击发送

此请求的输出如下所示

1
2
3
{
'text': 'Hello World'
}

第二个API

在本节中,我们将构建第二个API,它是一个POST请求。此外,如果用户点击一些随机网址,我们将需要指出它是无效路由。我们也将在这里添加逻辑。

controller.js

controller.js 中的代码更新为如下所示的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const http = require('http')
const url = require('url')

module.exports = http.createServer((req, res) => {

var service = require('./service.js')
const reqUrl = url.parse(req.url, true)

// GET Endpoint
if (reqUrl.pathname == '/sample' && req.method === 'GET') {
console.log('Request Type:' +
req.method + ' Endpoint: ' +
reqUrl.pathname)

service.sampleRequest(req, res)
// POST Endpoint
} else if (reqUrl.pathname == '/test' && req.method === 'POST'){
console.log('Request Type:' +
req.method + ' Endpoint: ' +
reqUrl.pathname)

service.testRequest(req, res)
} else {
console.log('Request Type:' +
req.method + ' Invalid Endpoint: ' +
reqUrl.pathname)

service.invalidRequest(req, res)
}
})

post端点将具有url /test。此代码具有检查/test 端点的条件。/test 端点的逻辑将在service.testRequest(req, res) 这是在service.js

此代码还具有无效路由的else 条件。无效路由的逻辑在service.invalidRequest(req, res) 中处理

service.js

将以下代码添加到service.js。不要删除service.js 中的现有代码。在现有代码下面添加此代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
exports.testRequest = function (req, res) {
body = ''

req.on('data', function (chunk) {
body += chunk
})

req.on('end', function () {

postBody = JSON.parse(body)

var response = {
'text': 'Post Request Value is ' + postBody.value
}

res.statusCode = 200
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify(response))
})
}

对于POST 请求,在调用端点时会给出输入POST body。

在代码中,我们需要从请求中获取此POST body。

以下代码执行此操作

1
2
3
req.on('data', function (chunk) {
body += chunk
})

请求以流steam 的形式出现。此代码获取数据流并继续将其附加到body

req.on('end', function () { 仅在流式传输完成并且收到完整的post body后执行。

postBody = JSON.parse(body) 此代码将输入的post body 转换为JSON格式,以便我们可以使用其中的值。

在代码中我们在postBody中使用value 字段。

响应的设置类似于我们为GET 请求所做的操作。

无效请求的逻辑

将以下代码添加到service.js。不要删除service.js 中的现有代码。在现有代码下面添加此代码。

1
2
3
4
5
exports.invalidRequest = function (req, res) {
res.statusCode = 404
res.setHeader('Content-Type', 'text/plain')
res.end('Invalid Request')
}

对于无效请求,状态设置为404,内容类型设置为text。发回的实际内容是Invalid Request

Testing

进入postman。选择请求类型为POST 并键入以下URL http://localhost:3000/test

同时选择如图所示的Bodyrawapplication/json

输入Post body如下

1
2
3
{
'value': 'nodejs'
}

点击postman 发送

API 输出如下

1
2
3
{
'text': 'Post Request Value is nodejs'
}

你也可以尝试使用无效请求。在postman 中选择GET 并输入URL http://localhost:3000/test123

对此的响应将是Invalid Text

恭喜😄

你现在知道如何在不使用任何框架或外部库的情况下在NodeJS 中创建REST API

在真实项目中,尽可能使用框架或库来使开发更容易,更快捷

LinkedIn中与我联系或在Twitter上关注我