Code前端首页关于Code前端联系我们

用 Node.js 搭建 API 服务器,《HTTP权威指南》 是基础

terry 2年前 (2023-09-28) 阅读数 55 #未命名

Node.js搭建API服务器,《HTTP权威指南》是基础

零基础用 Node.js 搭建 API 服务器

本文是为那些 Node.js 零基础但想要入门的前端开发者写的自己实现服务器API,尝试为每个人打开一扇门。

HTTP服务器实现原理

HTTP服务器之所以能够提供接口使用的API,是因为服务器不断监听计算机上的特定端口(通常是80),等待客户端请求。当请求到达并经过一系列处理后,服务器将响应数据发送到接口。通常,当我们通过Ajax调用API时,我们会发起一个请求。经过服务器处理后,我们得到结果,然后进行前端处理。如今,使用高级编程语言,实现服务器功能已经变得非常容易。接下来我们看看如何使用Node.js来实现。

什么是 Node.js?它能做什么?

Node.js 是一个 JavaScript 运行时。它提供了大量的API用于使用JS与操作系统交互。通过这些API,我们可以调用本地程序、读写磁盘、监听端口、发起网络请求等,这足以开发一个功能齐全的服务器。

准备工作

简单介绍了Node.js之后,在我们开始编写代码之前,我们需要安装Node.js。详细的安装过程就不解释了。请谷歌或百度。不同系统的安装过程有所不同。如果是Linux或者Mac的话,会比较顺利,遇到问题的可能性较低。要判断安装是否成功,在Windows下,在cmd中运行node -v。在 Linux 和 Mac 下,在 shell 中运行 node -v。如果正常打印版本号,则说明安装成功。

提示:如果Windows询问命令不存在,可能是环境变量没有配置

实现一个简单的服务器

Node.js已安装。让我们找个地方新建一个目录min-server作为存储我们代码的地方。 ,后面的所有代码都在这个目录下。首先在min-server目录下新建文件index.js,使用如下代码实现一个简单的服务器:

// index.js
// 通过require获取两个node内置模块
const http = require('http');
const nUrl = require('url');
// '127.0.0.1'表明只有本机可访问,'0.0.0.0'表示所有人可访问
const hostname = '127.0.0.1';
const port = 3000;
// 通过http.createServer获取一个server实例
// 其中(req, res) => {},在服务器每次接收到请求时都会被执行
const server = http.createServer((req, res) => {
  let method = req.method; // 客户端请求方法
  let url = nUrl.parse(req.url); // 将请求url字符串转换为node的url对象
  // 如果客户端GET请求'/',会执行这个分支里面的逻辑
  if (method === 'GET' && url.pathname === '/') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World');
    return;
  }
  // 如果客户端GET请求'/api/user',会执行这个分支里面的逻辑
  if (method === 'GET' && url.pathname === '/api/user') {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({
      code: 0,
      msg: '',
      result: {
        username: 'shasharoman'
      }
    }));
    return;
  }
  // 没有匹配其他分支的话,执行以下逻辑
  res.statusCode = 404;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Not Found');
});
//在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力
// server开始监听,等待请求到来
server.listen(port, hostname, () => {
  console.log(`Server running at <a href="http://${hostname}:${port}/`);"

编辑并保存文件内容后,通过min-server中的index.js命令节点启动服务-server目录,然后在浏览器中分别访问http://127.0.0.1:300/、http://127.0.0.1:300/api/user、http://127.0.0.1:300/xxx观察不同结果。

这是取自官方指南的代码,稍作修改,添加了一些注释和附加逻辑。主要是为了更清楚地传达以下知识点:

  • 从req对象中获取method和url。这个 req 对象是客户端请求的“抽象表示”。 Ajax指定的大部分内容都可以从这个对象中写入。获取
  • 中间添加的两个if分支,主要是让大家了解服务器如何区分不同的请求,决定做不同的事情,即路由概念
  • Content-Type: application/json,response通常由API格式使用,表示返回的数据为json格式。这是一个HTTP header,属于HTTP协议相关的知识
  • statusCode:404,最常见的HTTP错误“Not Found”,也属于HTTP协议相关的知识

优化转发步骤

通过上面的代码实现了一个简单的服务器,但是在真实的场景中我们会这样实现吗?答案肯定不是,所以我们还是需要一步步完善,进行如下修改:

  • 添加配置,在里面配置主机名和端口
  • 添加分层和子模块的控件
  • 添加路由,使用定义路由

代码不多,一共五个文件:

  • config.js、配置文件
  • route.js、路由定义文件
  • controller/account.js 模块业务实现文件
  • controller/index.js,业务汇总并对外暴露
  • index.js,项目启动文件
// config.js
exports = module.exports = {
  hostname: '127.0.0.1',
  port: '3000'
};
// route.js
exports = module.exports = [{
  method: 'GET',
  path: '/api/user',
  impl: 'account.userById'
}, {
  method: 'POST',
  path: '/api/user',
  impl: 'account.createUser'
}];
//在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力
// route.js
exports = module.exports = [{
  method: 'GET',
  path: '/api/user',
  impl: 'account.userById'
}, {
  method: 'POST',
  path: '/api/user',
  impl: 'account.createUser'
}];
// controller/index.js
exports.account = require('./account');
// index.js
const http = require('http');
const nUrl = require('url');
const config = require('./config');
const controller = require('./controller');
const route = require('./route').map(item => {
  console.log(`route ${item.method}:${item.path}`);
  let tuple = item.impl.split('.');
  item.impl = controller[tuple[0]][tuple[1]];
  return item;
});
const server = http.createServer((req, res) => {
  let method = req.method;
  let url = nUrl.parse(req.url);
  let matchRoute = route.find(item => {
    return item.method === method && item.path === url.pathname;
  });
  if (matchRoute) {
    matchRoute.impl(req, res);
    return;
  }
  res.statusCode = 404;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Not Found');
});
server.listen(config.port, config.hostname, () => {
  console.log(`Server running at <a href="http://${config.hostname}:${config.port}/`);" rel="external nofollow">http://${config.hostname}:${config.port}/`);
</a>});
//在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力

依然使用nodeindex.js启动服务端。如果要在现有模式下开发一个API,最重要的只有两步: 在route.js中定义路由

在controller/中实现

做这种程度的优化只是为了传达一些宽泛的概念给大家。并不是真正用来写API服务的,只是给大家,练练手。这个层次还达不到真实场景的需要,需要经过几轮改造,包括模块、层、commons、lib、查询解析、正文解析、更灵活的路由等等。由于篇幅所限,有机会我将一一描述。 。经过我的描述和代码示例,如果你有兴趣学习 Node.js,建议搜索更多相关知识,持续关注,然后逐步了解 Node.js 的流行 Web 框架如:Express、Koa、等等,但框架只是比较High的封装,基本概念和知识还是需要时间掌握的。如果前端想尝试后端编程,一定要先学习HTTP协议。建议《HTTP权威指南》从头到尾仔细阅读。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门