FreeBSD下安装npm Node.js的22版本 并简单测试js服务器

FreeBSD下安装Node.js

在FreeBSD下安装Node.js很方便,直接pkg安装即可。

使用pkg install安装npm

sudo pkg install npm-node22
Updating FreeBSD repository catalogue...
Fetching data.pkg: 100%    7 MiB   2.5MB/s    00:03
Processing entries: 100%
FreeBSD repository update completed. 35884 packages processed.
All repositories are up to date.
The following 3 package(s) will be affected (of 0 checked):New packages to be INSTALLED:gmake: 4.4.1node22: 22.13.1npm-node22: 10.9.2Number of packages to be installed: 3The process will require 76 MiB more space.
16 MiB to be downloaded.

建立js服务器

创建服务器目录

mkdir jsserver
cd jsserver/

初始化项目

npm init -y

输出: 

npm init -y
Wrote to /home/skywalk/work/jsserver/package.json:{"name": "jsserver","version": "1.0.0","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC","description": ""
}

安装依赖库

您可以使用 Express.js 来快速构建 Web 服务器。安装 Express 和其他必要的库:

npm install express body-parser cors

 创建服务器代码server.js


在项目目录中创建一个名为 server.js 的文件,并添加以下代码:

// server.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');const app = express();
const PORT = process.env.PORT || 3000;// 中间件
app.use(cors());
app.use(bodyParser.json());// 模拟 AI 响应
app.post('/api/chat', (req, res) => {const userInput = req.body.question;// 这里可以添加 AI 逻辑,当前只是返回一个固定的响应const response = `You asked: "${userInput}". This is a simulated response.`;res.json({ response });
});// 启动服务器
app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});

创建 JavaScript 库puter.js

这个文件并不是必须放在当前服务器的,可以放在其它服务器或者测试index.html网页的相同目录。
这里为了代码管理方便,也同时在项目目录中创建一个名为 puter.js 的文件,并添加以下代码:

// puter.js
const puter = {ai: {chat: function(question) {return fetch('http://localhost:3000/api/chat', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ question })}).then(response => response.json());}},print: function(data) {console.log(data.response);alert(data.response); // 也可以用 alert 显示响应}
};// 将 puter 对象暴露到全局
window.puter = puter;

启动服务

执行以下命令启动服务

node server.js

可以看到输出:Server is running on http://localhost:3000

服务器启动了。

创建前端 HTML 文件

这个文件并不是必须放在当前服务器的,可以放在其它服务器或者测试puter.js的相同目录。
这里为了代码管理方便,也同时在项目目录中创建一个名为 index.html 的文件,并添加以下代码:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>AI Chat Example</title><script src="puter.js"></script>
</head>
<body><script>puter.ai.chat(`你好! AI!`).then(data => puter.print(data));</script>
</body>
</html>

测试

先用curl测试服务器

curl -X POST http://localhost:3000/api/chat \
-H "Content-Type: application/json" \
-d '{"question": "你能告诉我今天的天气吗?"
}'

回复

{"response":"You asked: \"你能告诉我今天的天气吗?\". This is a simulated response."}

证明js服务器是ok的。 

整体测试

在同一目录放置index.html和puter.js文件,然后用浏览器直接打开这个index.html文件,会显示弹出信息:

 

证明index.html文件里的puter.js这个js脚本起作用了。 可以看到index.html文件中是没有写http://localhost:3000/api/chat 这个地址的,它调用了puter.js文件,并使用了这句话puter.ai.chat(`你好! AI!`).then(data => puter.print(data)); 来调用了puter.ai.chat的程序。

恭喜测试通过!

以后我们就可以搭建一台自己的js服务器来架设AI服务啦!

进一步思考api秘钥问题

在使用 puter.js 或任何前端 JavaScript 代码调用 OpenAI 的 API 时,保护 API 密钥是非常重要的,因为将密钥直接嵌入到前端代码中会导致密钥暴露,可能被恶意用户滥用。以下是一些保护 API 密钥的最佳实践:

1. 使用后端代理

最安全的方法是通过后端服务器来代理请求。可以创建一个后端 API,前端代码只与这个后端 API 交互,而后端 API 再与 OpenAI 的 API 进行通信。这样,API 密钥只存储在后端,不会暴露给前端。

2. 使用环境变量

在后端代码中,使用环境变量来存储 API 密钥,而不是硬编码在代码中。可以使用 .env 文件和 dotenv 包来加载环境变量。

3. 限制 API 密钥的权限

例如,设置 IP 白名单或限制请求的速率,以减少潜在的滥用风险。

比如puter官方的js AI库,就是限定它的公有云服务器可以调用,用户自己搭建的私有服务器不可以调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32151.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生可观测性体系:数字世界的神经感知网络

引言&#xff1a;从监控到全景式观测的范式升级 Datadog每日处理百万亿指标&#xff0c;Elastic APM实现万级服务拓扑动态发现。Grafana Loki日志分析延迟降至200ms内&#xff0c;Prometheus单集群支持千万时序存储。Uber通过全链路追踪压缩故障定位时间至秒级&#xff0c;Net…

基于VMware的Ubuntu22.04系统安装和配置以及解决Ubuntu共享文件夹无法实现的问题

一、前期准备 本次安装的虚拟机软件是 VMware Workstation Pro 17 登录跳转到 所有产品 进行下载 ​​​跳转到下载页面​​​ 选择 Windows 产品进行安装 勾选协议同意下载 离线版提供&#xff1a;大家根据自己电脑版本配置进行选择下载 本篇使用的虚拟机版本为 VMware Wor…

线程同步与互斥

目录 资源共享问题 &#xff08;一&#xff09;临界资源与临界区 &#xff08;二&#xff09;多线程并发访问问题 &#xff08;三&#xff09;锁 互斥锁原理 加锁原理 解锁原理 互斥锁相关操作接口 互斥锁封装 死锁 死锁产生的四个必要条件 解决死锁方法 &#xff…

SpringMVC 基本概念与代码示例

1. SpringMVC 简介 SpringMVC 是 Spring 框架中的一个 Web 层框架&#xff0c;基于 MVC&#xff08;Model-View-Controller&#xff09; 设计模式&#xff0c;提供了清晰的分层结构&#xff0c;适用于 Web 应用开发 SpringMVC 主要组件 DispatcherServlet&#xff08;前端控…

Banana Pi OpenWRT One Wifi6 OpenWrt社区官方开源路由器评测

第一款不可破解、开源、版权软件、符合 FCC、CE 和 RoHS 的维修权路由器 OpenWRT项目今年已经20岁了&#xff0c;为了纪念这一时刻&#xff0c;Banana Pi OpenWrt One/AP-24.XY路由器开发系统已经上市。这是OpenWRT团队与硬件公司的第一个联合项目。选择 Banana Pi&#xff0c;…

打造智能钉钉机器人:借助智谱GLM-4-Flash实现高效智能回复(文末附源码)

文章目录 前言一、准备工作&#xff08;一&#xff09;钉钉机器人&#xff08;二&#xff09;智谱 GLM-4-Flash&#xff08;三&#xff09;内网穿透工具 cpolar&#xff08;四&#xff09;需要准备的工具和环境 二、钉钉机器人的创建与配置步骤1&#xff1a;创建钉钉机器人步骤…

react基础语法视图层类组件

react基础语法视图层&类组件 MVVM *区别mvc&mvvm 两者的区别&#xff1a; 数据模型去渲染视图。数据层改了&#xff0c;vue自己会监听到帮我们拿最新的数据去渲染视图&#xff1b;构建数据构建视图&#xff0c;数据驱动的思想。这一套是非常相似的。 视图中的内容改变&…

数据结构--【顺序表与链表】笔记

顺序表 template <class T> class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类 //公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员&#xff0c;受保护成员在 arrList 类中仍然是受保护成员。 { …

Docker容器与宿主机目录映射深度解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、Docker容器与宿主机目录映射基础原理 在深入了解如何查询 Docker 容器目录在宿主机的映射目录之前&#xff0c;有必要先明晰其背后的基础原理。Docker 容器通过挂载&#xff08;mount&#xff09;机制将宿主机的…

p5.js:模拟 n个彩色小球在一个3D大球体内部弹跳

向 豆包 提问&#xff1a;编写一个 p5.js 脚本&#xff0c;模拟 42 个彩色小球在一个3D大球体内部弹跳。每个小球都应留下一条逐渐消失的轨迹。大球体应缓慢旋转&#xff0c;并显示透明的轮廓线。请确保实现适当的碰撞检测&#xff0c;使小球保持在球体内部。 cd p5-demo copy…

javascript-es6 (六)

编程思想 面向过程 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次 调用就可以了 就是按照我们分析好了的步骤&#xff0c;按照步骤解决问题 面向对象 面向对象是把事务分解成为一个个对象&…

Linux第0节:Linux环境的搭建

一、Linux 环境的搭建方式 搭建方式主要有三种&#xff1a; 直接安装在物理机上。但是由于 Linux 桌面使用起来非常不友好&#xff08;不推荐&#xff09;。使用虚拟机软件, 将 Linux 搭建在虚拟机上。但是由于当前的虚拟机软件(如 VMWare 之类的)存在一些 bug , 会导致环境上…

计算机网络:计算机网络的概念

1.计算机网络&#xff1a;由若干个结点和链接这些的链路组成。 2.集线器&#xff08;Hub&#xff09;&#xff1a;可以把多个结点连接起来&#xff0c;组成一个计算机网络。 不能避免数据冲突的情况 3.交换机&#xff08;Switch&#xff09;:可以把多个结点连接起来&#x…

mysql的锁-->一篇读懂所有锁机制

目录 mysql的锁 概述&#xff1a;根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁&#xff1f; 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…

Vue 实现智能检测文字是否溢出,溢出显示省略号,鼠标悬浮显示全部【附封装组件完整代码+详细注释+粘贴即食】

一、场景需求 在项目中&#xff0c;经常会遇到文本内容超出容器的情况。为了提高用户体验&#xff0c;我希望在文字溢出时显示悬浮提示&#xff0c;未溢出时则不显示。 二、效果演示 三、实现原理 DOM宽度对比法&#xff1a;通过比较元素的scrollWidth&#xff08;实际内容宽…

用Deepseek写一个 HTML 和 JavaScript 实现一个简单的飞机游戏

大家好&#xff01;今天我将分享如何使用 HTML 和 JavaScript 编写一个简单的飞机游戏。这个游戏的核心功能包括&#xff1a;控制飞机移动、发射子弹、敌机生成、碰撞检测和得分统计。代码简洁易懂&#xff0c;适合初学者学习和实践。 游戏功能概述 玩家控制&#xff1a;使用键…

《Spring日志整合与注入技术:从入门到精通》

1.Spring与日志框架的整合 1.Spring与日志框架进行整合&#xff0c;日志框架就可以在控制台中&#xff0c;输出Spring框架运行过程中的一些重要的信息。 好处&#xff1a;方便了解Spring框架的运行过程&#xff0c;利于程序的调试。 Spring如何整合日志框架 Spring5.x整合log4j…

关于mybatis查询时,时间字段的映射问题

目录 1.mysql中&#xff0c;关于时间的两种类型 1.1 date 1.2 datetime 2.mybatis从mysql数据库查询出上述两种类型的字段后&#xff0c;映射到Java实体类时的问题 3.结语 1.mysql中&#xff0c;关于时间的两种类型 1.1 date 格式&#xff1a;2002-09-23 特点&#xff1a…

高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架

一、背景 在快节奏的开发周期中&#xff0c;如何确保接口质量&#xff1f;自动化测试是关键。通过构建标准化、可复用的测试框架&#xff0c;能显著提升测试效率与准确性&#xff0c;为项目质量保驾护航[1][7]。 二、目标 ✅ 核心目标&#xff1a; ● 实现快速、高效的接口测试…

【鸿蒙开发】MongoDB入门

https://www.mongodb.com/try/download/community 下载MongoDB: var mongoose require("mongoose");// localhost 域名&#xff0c;代表本机 // 127.0.0.1 ip , 代码本机 mongoose.connect("mongodb://localhost:27017/jiaju").then(() > {console.l…