日本电影一区二区_日本va欧美va精品发布_日本黄h兄妹h动漫一区二区三区_日本欧美黄色

在.NET中動(dòng)態(tài)調(diào)用Nodejs代碼實(shí)現(xiàn)低代碼平臺(tái)代碼塊節(jié)點(diǎn)(nodejs調(diào)用動(dòng)態(tài)庫(kù))

在.NET中動(dòng)態(tài)調(diào)用Nodejs代碼實(shí)現(xiàn)低代碼平臺(tái)代碼塊節(jié)點(diǎn)(nodejs調(diào)用動(dòng)態(tài)庫(kù))
在.NET中動(dòng)態(tài)調(diào)用Nodejs代碼實(shí)現(xiàn)低代碼平臺(tái)代碼塊節(jié)點(diǎn)(nodejs調(diào)用動(dòng)態(tài)庫(kù))

在低代碼平臺(tái)中,通常有業(yè)務(wù)邏輯編排的能力,在業(yè)務(wù)邏輯編排中有很多不同類型的節(jié)點(diǎn),例如:邏輯判斷、接口調(diào)用、數(shù)據(jù)更新等,但為了方便開發(fā)人員使用,如果添加代碼塊的節(jié)點(diǎn),將會(huì)極大增加開發(fā)效率。

代碼塊節(jié)點(diǎn)可以使用 Node.js、Python 等解釋型語(yǔ)言來(lái)處理邏輯,在《dotnet 5 中執(zhí)行 Node.js》一文中,介紹了在 .NET 中通過(guò) NodeServices 包來(lái)動(dòng)態(tài)執(zhí)行 Node.js 代碼。但會(huì)有些局限。比如用戶想要使用更多的 Node.js 包,就不太容易做到。

在.NET中動(dòng)態(tài)調(diào)用Nodejs代碼實(shí)現(xiàn)低代碼平臺(tái)代碼塊節(jié)點(diǎn)(nodejs調(diào)用動(dòng)態(tài)庫(kù))

所以本文介紹另一種思路了,其實(shí)非常簡(jiǎn)單,主要分三步:

1、編寫 Node.js 服務(wù),執(zhí)行 js 代碼

2、編寫 .NET API 接口,調(diào)用 Node.js 服務(wù)

3、使用 Docker 進(jìn)行部署

Node.js 服務(wù)

1、使用 Node.js 的 express 框架來(lái)實(shí)現(xiàn)一個(gè) Node.js 服務(wù),首先用 npm init 進(jìn)行初始化一個(gè)項(xiàng)目,初始化后,會(huì)產(chǎn)生一個(gè) package.json ,內(nèi)容如下:

{
"name": "api-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "",
"license": "ISC"
}

2、使用命令 npm i express安裝 express ,安裝時(shí)可以會(huì)出現(xiàn)下面錯(cuò)誤,這時(shí)可以切換不同的鏡像源進(jìn)行嘗試:

在.NET中動(dòng)態(tài)調(diào)用Nodejs代碼實(shí)現(xiàn)低代碼平臺(tái)代碼塊節(jié)點(diǎn)(nodejs調(diào)用動(dòng)態(tài)庫(kù))

使用下面命令可以切換鏡像源:

npm config set registry https://npm.aliyun.com/

如果還是不成功,可以嘗試幾個(gè)不同的鏡像源,我是換到中科大就迅速安裝成功了:

騰訊:http://mirrors.cloud.tencent.com/npm/
華為:https://mirrors.huaweicloud.com/repository/npm/
中科大鏡像:https://registry.npmjs.org/
淘寶鏡像1:https://registry.npm.taobao.org
淘寶鏡像2:https://registry.npmmirror.com

3、使用 VS Code 打開 package.json 所在目錄,并且添加 api.js 文件,文件內(nèi)容如下:

const express = require('express');
const app = express;

app.use(express.json)

app.listen(3006, => console.log('express 服務(wù)啟動(dòng)成功'));

app.post('/execute', (req, res) => {
const data = req.body
console.log(data)

if(data && data.Code){
var code=data.Code;
try{
var result=eval(code);
res.json({result});
}catch(e){
res.json({error:e.message});
}
}else{
res.json({error:'Invalid request body'});
}
});

  • 可以在命令行使用 node api.js進(jìn)行服務(wù)啟動(dòng),啟動(dòng)后可以在瀏覽器用 3006 端口進(jìn)行訪問(wèn)

  • 上面代碼中定義了一個(gè)路由為 execute 的 Post 接口

  • 接口接受到需要執(zhí)行的 js 代碼,使用 eval 進(jìn)行執(zhí)行,然后返回結(jié)果

.NET 調(diào)用

下面使用 .NET 8 的 Mini API ,創(chuàng)建一個(gè)接口來(lái)進(jìn)行對(duì) Node.js 服務(wù)的調(diào)用。

1、在 Rider 中創(chuàng)建一個(gè) .NET 8 的 Web API 項(xiàng)目。

2、接口代碼如下:

using System.Net.Http.Headers;
using Newtonsoft.Json;
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer;
builder.Services.AddSwaggerGen;

builder.Services.AddHttpClient;

var app = builder.Build;

if (app.Environment.IsDevelopment)
{
app.UseSwagger;
app.UseSwaggerUI;
}
app.UseHttpsRedirection;

app.MapPost("/run", async (IHttpClientFactory clientFactory,CodeBlockInfo codeBlockInfo) =>
{
var client = clientFactory.CreateClient;
string uri = "http://localhost:3006/execute";

HttpContent context = new StringContent(JsonConvert.SerializeObject(codeBlockInfo));
context.Headers.ContentType = new MediaTypeHeaderValue("application/json");

var result = await client.PostAsync(uri,context);
string resultContent = result.Content.ReadAsStringAsync.Result;
return resultContent;
});

app.Run;

public class CodeBlockInfo
{
public string Code { get; set; }
}

  • 定義一個(gè) CodeBlockInfo 實(shí)體用來(lái)傳輸需要執(zhí)行的 js 代碼

  • 接口 run 中調(diào)用 Node.js 的服務(wù),然后將執(zhí)行的結(jié)果返回

  • 關(guān)于使用 HttpClient 調(diào)用第三方接口,可以參考:https://learn.microsoft.com/zh-cn/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

3、下面一段 js 代碼是解析身份證號(hào),從中提取出生日期和性別:

var idcard = '420111202401011234';
var birthday = idcard.substr(6, 4) '-' idcard.substr(10, 2) '-' idcard.substr(12, 2);
var sex = '女';
if (idcard.substr(16, 1) % 2 == 1) {
sex = '男';
};
output={'生日':birthday,'性別':sex}

4、運(yùn)行 .NET 程序,使用 Postman 進(jìn)行測(cè)試,上面的代碼就是入?yún)ⅲ?/p>

在.NET中動(dòng)態(tài)調(diào)用Nodejs代碼實(shí)現(xiàn)低代碼平臺(tái)代碼塊節(jié)點(diǎn)(nodejs調(diào)用動(dòng)態(tài)庫(kù))

部署

Node.js

1、在目錄中創(chuàng)建 Dockerfile 文件,內(nèi)容如下:

FROM node:latest
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3006
CMD ["node", "api.js"]

2、執(zhí)行下面命令進(jìn)行鏡像構(gòu)建:

docker build -t node-execute-code-demo .

3、執(zhí)行下面命令運(yùn)行容器:

docker run -d -p 3106:3006 --name node-execute-code-demo --restart=always node-execute-code-demo

.NET API

1、對(duì) API 項(xiàng)目進(jìn)行發(fā)布,發(fā)布后的內(nèi)容在 bin/Release/net8.0/publish/目錄中。

2、在 publish 目錄中添加 Dockerfile 文件,內(nèi)容如下:

FROM mcr.microsoft.com/dotnet/aspnet:8.0
COPY . /app
WORKDIR /app
EXPOSE 5271/tcp
ENTRYPOINT ["dotnet", "Run-NodeJS-Demo.dll"]

3、執(zhí)行下面命令進(jìn)行鏡像構(gòu)建:

docker build -t net-run-nodejs-demo .

4、執(zhí)行下面命令運(yùn)行容器:

docker run -d -p 9090:8080 --name net-run-nodejs-demo --restart=always net-run-nodejs-demo

需要注意的是,上面的代碼示例中將 Node.js 的訪問(wèn)地址寫死在了接口方法中,并且使用的是 localhost,如果部署到容器中會(huì)導(dǎo)致不能正常訪問(wèn),正式環(huán)境需要使用服務(wù)器的 IP,并使用配置的方式。

使用 Docker Compose

上面的兩個(gè)步驟中已經(jīng)創(chuàng)建了 Node.js 和 .NET API 的鏡像,下面使用一個(gè) Docker Compose 的方式來(lái)進(jìn)行容器的管理。

1、創(chuàng)建一個(gè) code-execute-demo 目錄。

2、在目錄中創(chuàng)建 docker-compose.yml 文件,文件內(nèi)容如下:

version: "3"

networks:
fw_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.88.8.0/24

services:
nodejs:
restart: always
image: node-execute-code-demo:latest
ports:
- "3106:3006"
environment:
- TZ=Asia/Shanghai
networks:
fw_net:
ipv4_address: 172.88.8.2

net-api:
restart: always
image: net-run-nodejs-demo
ports:
- "9090:8080"
environment:
- TZ=Asia/Shanghai
networks:
fw_net:
ipv4_address: 172.88.8.3

3、命令執(zhí)行 docker-compose up -d進(jìn)行容器的構(gòu)建,構(gòu)建完成可以使用docker-compose ps來(lái)查看容器是否正常:

在.NET中動(dòng)態(tài)調(diào)用Nodejs代碼實(shí)現(xiàn)低代碼平臺(tái)代碼塊節(jié)點(diǎn)(nodejs調(diào)用動(dòng)態(tài)庫(kù))

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號(hào)
公眾號(hào)
在線咨詢
分享本頁(yè)
返回頂部
滦平县| 织金县| 剑河县| 高雄市| 布拖县| 镇远县| 乌拉特后旗| 左贡县| 福泉市| 若羌县| 芜湖县| 扬州市| 梁山县| 烟台市| 鹿邑县| 伊春市| 通化市| 富裕县| 昭通市| 乌拉特中旗| 墨玉县| 濮阳市| 行唐县| 瑞金市| 惠东县| 得荣县| 连州市| 皮山县| 高平市| 聂拉木县| 鄱阳县| 绥江县| 伊宁县| 南召县| 泾源县| 阿勒泰市| 安顺市| 聊城市| 丹巴县| 双牌县| 襄垣县|