{ "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 ,安装时可以会出现下面错误,这时可以切换不同的镜像源进行尝试:
npm config set registry https://npm.aliyun.com/如果还是不成功,可以尝试几个不同的镜像源,我是换到中科大就迅速安装成功了:
腾讯: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.com3、使用 VS Code 打开 package.json 所在目录,并且添加 api.js 文件,文件内容如下:
const express = require('express'); const app = express(); app.use(express.json()) // 堆代码 duidaima.com app.listen(3006, () => console.log('express 服务启动成功')); 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 进行服务启动,启动后可以在浏览器用 3006 端口进行访问
.接口接受到需要执行的 js 代码,使用 eval 进行执行,然后返回结果
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; } }.定义一个 CodeBlockInfo 实体用来传输需要执行的 js 代码
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、运行 .NET 程序,使用 Postman 进行测试,上面的代码就是入参:
FROM node:latest WORKDIR /app COPY . . RUN npm install EXPOSE 3006 CMD ["node", "api.js"]2、执行下面命令进行镜像构建:
docker build -t node-execute-code-demo .3、执行下面命令运行容器:
docker run -d -p 3106:3006 --name node-execute-code-demo --restart=always node-execute-code-demo.NET API
FROM mcr.microsoft.com/dotnet/aspnet:8.0 COPY . /app WORKDIR /app EXPOSE 5271/tcp ENTRYPOINT ["dotnet", "Run-NodeJS-Demo.dll"]3、执行下面命令进行镜像构建:
docker build -t net-run-nodejs-demo .4、执行下面命令运行容器:
docker run -d -p 9090:8080 --name net-run-nodejs-demo --restart=always net-run-nodejs-demo需要注意的是,上面的代码示例中将 Node.js 的访问地址写死在了接口方法中,并且使用的是 localhost,如果部署到容器中会导致不能正常访问,正式环境需要使用服务器的 IP,并使用配置的方式。
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.33、命令执行 docker-compose up -d 进行容器的构建,构建完成可以使用 docker-compose ps 来查看容器是否正常: