当前位置: 首页 > news >正文

Node.js:RESPful API、多进程

什么是REST

REST–>Representational State Transfer
一种软件架构风格,即“表述性状态传递”
表述性状态传递是一组架构约束条件和原则。满足这些约束调教和原则的应用程序或者设计就是RESTful,需要注意的是,REST是设计风格而不是标准。
REST通常基于使用HTTP、URL、XML以及HTML,这些现有的广泛烈性的协议和标准。REST通常使用JSON数据格式


HTTP方法

REST基本架构基于四个方法

  • GET—获取数据
  • PUT—用于更新或者添加数据
  • DELETE—用于删除数据
  • POST—用于添加数据

RESTful Web Services

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
由于通过轻量级以及通过HTTP直接传输数据的特性,Web服务的RESTful方法已经称为最常见的替代方法,可以使用各种语言实现客户端


创建RESTful

首先是创建json数据,users.json

{"user1" : {"name" : "mahesh","password" : "password1","profession" : "teacher","id": 1},"user2" : {"name" : "suresh","password" : "password2","profession" : "librarian","id": 2},"user3" : {"name" : "ramesh","password" : "password3","profession" : "clerk","id": 3}}

获取用户列表
var express = require('express');
var app = express();
var fs = require("fs");app.get('/listUsers', function (req, res) {fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {console.log( data );res.end( data );});
})var server = app.listen(8081, function () {
var host = server.address().address 
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)})

添加用户

创建一个API用于添加用户数据

var express = require('express');
var app = express();
var fs = require("fs");//添加的新用户数据
var user = {"user4" : {"name" : "mohit","password" : "password4","profession" : "teacher","id": 4}}app.get('/addUser', function (req, res) {// 读取已存在的数据fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {data = JSON.parse( data );//通过parse函数将data转化为json数据,是一个对象数据data["user4"] = user["user4"];//操作数据console.log( data );res.end( JSON.stringify(data));});})var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

显示用户详情

可以指定读取某个特定用户的详细信息。


var express = require('express');
var app = express();
var fs = require("fs");app.get('/:id', function (req, res) {// 首先我们读取已存在的用户fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {data = JSON.parse( data );var user = data["user" + req.params.id] console.log( user );res.end( JSON.stringify(user));});})var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

此时在浏览器中输入http://127.0.0.1:8081/2
出现了第二个用户信息


删除用户

使用路由来删除指定的用户信息


var express = require('express');
var app = express();
var fs = require("fs");var id = 2;app.get('/deleteUser', function (req, res) {// First read existing users.fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {data = JSON.parse( data );delete data["user" + id];console.log( data );res.end( JSON.stringify(data));});})var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})

Node.js多进程

由于Node是通过单线程的模式来运行的,但是它使用的是事件驱动来处理并发的
node.js在10.5之前是没有多线程支持的,要使用多线程需要使用C++扩展模块来支持。从v10.5开始,node.js添加了线程的支持模块worker_threads,其实现类似于浏览器中的Web Workers。

每个子进程总是带有了三个流对象child.stdin,child.stdout和child.stderr,他们可能共享父进程的stdio流,或者也可以独立被导流的流对象

Node提供了child_process模块来创建子进程。方法有

  • exec使用子进程执行命令并且缓存子进程的输出,并将子进程输出以回调函数的形式返回

  • spawn 指定的命令行参数创建新进程

  • fork是spawn的特殊形式,用于在子进程中运行的模块,会在父进程和子进程之间建立一个通信管道,用于进程间通信.

exec( )

exec使用子进程执行命令,缓存子进程的输出,并且将子进程的输出以回调函数的形式返回。
执行语法如下:

child_process.exec(command[, option], callback)
  • command 字符串,将要运行的命令

  • option对象,可以是:
    请添加图片描述

  • callback 回调函数,包含三个参数error,stdin和stderr

exec方法返回最大的缓冲区,并且等待进程结束,一次性返回缓冲区的内容


const child_process = require('child_process');
//调用子进程模块
for(var i=0;i<3;i++){var workProcess = child_process.exec('java --version',function(error,stdout,stderr){//调用子进程执行一段Commandif(error){console.log(error.stack);console.log("Error Code: "+error.code);console.log("Signal received: "+error.signal);}console.log("stdout: "+stdout);console.log("stderr: "+stderr+"\n");});workProcess.on('exit',function(code){console.log("子进程已经结束,退出代码为:"+code);});
}

输出结果为:

子进程已经结束,退出代码为:0
stdout: java 19.0.1 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)stderr:子进程已经结束,退出代码为:0
stdout: java 19.0.1 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)stderr:子进程已经结束,退出代码为:0
stdout: java 19.0.1 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)stderr:
spawn( )方法

spawn( )使用指定的命令行参数创建新的进程,语法格式如下:

child_process.spawn(command[, args][, options])
  • command 要运行的命令
  • args Array字符串参数数组
    请添加图片描述

spawn( )返回流stdout &stderr,在进程返回大量数据的时候使用,一旦进程开始执行spawn( )就开始接收响应

const child_process = require('child_process');
//调用子进程模块
for(var i=0;i<3;i++){var workProcess = child_process.spawn('java', ['--version']);//调用子进程执行一段CommandworkProcess.stdout.on('data',function(data){console.log('stdout:'+data);});workProcess.stderr.on('data',function(data){console.log('stderr:'+data);});workProcess.on('exit',function(code){console.log('子进程已经结束,退出码:'+code);});
}

输出结果为:

stdout:java 19.0.1 2022-10-18stdout:java 19.0.1 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)stdout:Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)stdout:java 19.0.1 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)子进程已经结束,退出码:0
子进程已经结束,退出码:0
子进程已经结束,退出码:0
fork方法

是spawn()方法的特殊形式,用于创建进程,语法格式为:

child_process.fork(modulePath[, args][, options])
  • modulePath:String,将要在子进程中运行的模块
  • args:Array字符串参数数组
  • options:Object
    请添加图片描述

返回的对象除了拥有ChildProcess实例的所有方法,还有一个内建的通信信道

const child_process = require('child_process');
//调用子进程模块
for(let i=0;i<3;i++){let workProcess = child_process.fork("2.js",[i]);workProcess.on('close',function(code){console.log("子进程已结束,退出码: "+code);});
}

运行结果为:

进程 0 执行。
进程 1 执行。
进程 2 执行。
子进程已结束,退出码: 0
子进程已结束,退出码: 0
子进程已结束,退出码: 0
http://www.lryc.cn/news/596433.html

相关文章:

  • 【STM32】CRC 校验函数
  • linux初识网络及UDP简单程序
  • 二、计算机网络技术——第3章:数据链路层
  • 基于卷积神经网络与小波变换的医学图像超分辨率算法复现
  • DeepSPV:一种从2D超声图像中估算3D脾脏体积的深度学习流程|文献速递-医学影像算法文献分享
  • zmaiFy来说软字幕和硬字幕有什么优缺点?
  • qtbase5-dev库使用介绍
  • 生成式人工智能对网络安全的影响
  • OpenCV快速入门之CV宝典
  • 博物馆智慧导览系统AR交互与自动感应技术:从虚实融合到智能讲解的技术实践
  • 内核协议栈源码阅读(一) ---驱动与内核交互
  • Spring AI Alibaba + JManus:从架构原理到生产落地的全栈实践——一篇面向 Java 架构师的 20 分钟深度阅读
  • 打造智能化应用新思路:扣子Coze工作流详解与最佳实践
  • MCU中的总线桥是什么?
  • js的基本内容:引用、变量、打印、交互、定时器、demo操作
  • 聚簇索引的优势
  • LeetCode|Day22|231. 2 的幂|Python刷题笔记
  • windows下nvm的安装及使用
  • 融云“通信+AI”解决方案三大场景实例
  • 使用mybatis实现模糊查询和精准查询切换的功能
  • GraphRAG的部署和生成检索过程体验
  • 小白成长之路-部署Zabbix7
  • 使用react编写一个简单的井字棋游戏
  • 17.VRRP技术
  • 接口自动化测试种涉及到接口依赖怎么办?
  • 微调大语言模型(LLM)有多难?
  • Google Gemini 体验
  • 深入解析Hadoop中的推测执行:原理、算法与策略
  • kafka查看消息的具体内容 kafka-dump-log.sh
  • SDC命令详解:使用set_min_library命令进行约束