随着人工智能 Chatgpt的出现,各种国产AI大模型应用而出,如豆包、文心一言、通义千问、kimi等等,同时,我们也发现有各种各样的套壳APP在割韭菜!
作为一个程序员,我们不能助长这种套壳App的嚣张气焰,我们要用魔法打败魔法,实现一个只属于我们自己的ChatGpt!
在这篇文章中,我将介绍如何利用 Node.js 和 WebSocket 实现一个基于kimi(Moonshot 月之暗大模型)的AI工具,让我们快速拥有属于自己的ChatGpt。大致实现的效果:
技术栈简介
如果你需要批量写入文件,可以使用Node.js的fs模块来实现。你可以通过循环或迭代的方式,针对每一个需要写入的文件执行写入操作
下面是一个示例代码,演示了如何批量写入文件
const fs = require('fs');
function writeToFile(filePath, data) {
fs.writeFile(filePath, data, 'utf8', error => {
if(error) {
console.error(`Error writing to file ${filePath}:`, error);
} else {
console.log(`Data written to file ${filePaht} successfully.`)
}
})
}
// 示例:批量写入文件
const filesToWrite = [
{ path: 'file1.txt', data: 'Hello, file 1!' },
{ path: 'file2.txt', data: 'Hello, file 2!' },
{ path: 'file3.txt', data: 'Hello, file 3!' }
]
filesToWrite.forEach(file => {
const filePath = file.path;
const data = file.data;
writeToFile(filePath, data);
})
什么是Volta
Volta 是一种管理Javascript命令行工具的便捷方式
volta的特点
- 速度
- 无缝,每个项目的版本切换
- 跨平台支持,包括windows和所有Unix shell
- 支持多个包管理器
- 稳定的工具暗转-无需每次升级都要重新安装
- 可扩展性挂钩用于特定于站点的定制
为什么选择Volta?
使用Volta,你可以一次选择Node引擎,然后不在担心它。你可以在项目之间切换,而不必手动切换Nodejs版本。你可以在工具链中安装npm二进制包,而不必定期重新安装他们,或者弄清楚他们停止工作的原因
前言
大家好,我是webfansplz.继将 Vue 渲染到嵌入式液晶屏后,今天要跟大家分享的是如何将Vue渲染到命令行工具 😃.关于命令行工具,大家应该都比较熟悉了,比如vue-cli、Vite等.我们在编写前端应用面向用户时,通常会非常关注用户体验,作为开发者,我们在使用工具时,它给予我们的开发者体验(DX)我们也会十分关注.团队在今年有自研脚手架的计划,作为前端,我就在想是否能有较低成本的研发方案能让团队的小伙伴参与进来,大家可以像编写前端应用一样搞定它.因此,Temir应运而生.
Temir
资料
Node.js默认单进程运行,对于32位系统最高可以使用512MB内存,对于64位最高可以使用1GB内存。对于多核CPU的计算机来说,这样做效率很低,因为只有一个核在运行,其他核都在闲置,PM2利用的node原生的cluster模块可以顺利解决该问题。
pm2是一个带有负载均衡功能的应用进程管理器,可以使node服务在后台运行。
安装
npm install pm2 -g
- sql注入:窃取数据库内容
- XSS攻击:窃取前端的cookie内容
- 密码加密:保障用户信息安全(重要!)
补充
- server 端的攻击方式非常多,以防手段也非常多
- 本文章之讲常见的、能通过 web server (nodejs) 层面预防的
- 有些攻击需要硬件和服务来支持(需要 OP 支持),如 DDOS
sql注入
- 最原始、最简单的攻击,从有了web2.0就有了sql注入攻击
- 攻击方式:输入一个sql片段,最终拼接成一段攻击代码
- 预防措施:使用mysql的escape函数处理输入内容即可
开始
使用express
- express是nodejs最常用的web server框架
- 什么是框架?(架子,制定了一些标准,开发更简单更关注业务开发;特点:封装一些api、有一定流程和标准形成一套标准的解决方案)
- 不要以为express过时了
目录
- express下载、安装和使用,express中间件机制
- 开发接口,连接数据库,实现登录,日志记录
- 分析express中间件原理
- 初始化项目,之前的部分代码可以服用
- 开发路由,并实现登录
- 记录日志
初始化环境
- 安装插件mysql xss
- mysql controller resModel 相关代码可以服用
- 初始化路由
express处理session
- 使用express-session 和 connect-redis,简单方便
- req.session保存登录信息,登录校验做成express中间件
API对接mysql(博客列表)
// src/controller/blog.js
const { exec } = require('../db/mysql')
const getList = (author, keyword) => {
let sql = `select * from blogs where 1=1 ` // 1=1 占位 如果author 和keyword都不存在的情况下
if (author) {
sql += `and author='${author}'`
}
if (keyword) {
sql += `and title like '%${keyword}%'`
}
sql += `order by createtime desc`
// 返回的是promise
return exec(sql)
}
//src/router/blog.js
// 获取博客列表
// 获取博客列表
if (method === 'GET' && req.path === '/api/blog/list') {
const author = req.query.author || ''
const keyword = req.query.keyword || ''
// const listData = getList(author, keywords)
// return new SuccessModel(listData)
const result = getList(author, keyword)
return result.then((listData) => {
return new SuccessModel(listData)
})
}
// app.js
// 处理 post data
getPostData(req).then((postData) => {
req.body = postData
// 处理blog路由
// const blogData = handleBlogRouter(req, res)
// if (blogData) {
// res.end(JSON.stringify(blogData))
// return
// }
const blogResult = handleBlogRouter(req, res) // 重点这里
if (blogResult) {
blogResult.then((blogData) => {
res.end(JSON.stringify(blogData))
})
return
}
// 处理user路由
const userData = handleUserRouter(req, res)
if (userData) {
res.end(JSON.stringify(userData))
return
}
// 未命中路由,返回 404
res.writeHead(404, { 'Content-Type': 'text/plain' })
res.write('404 Not Fount\n')
res.end()
})