制作ChatPDF之后端Node搭建(三)

后端Node搭建

接上篇:制作ChatPDF之前端Vue搭建(二)

项目结构

下面是项目的结构图,包括前端 (Vue.js) 和后端 (Node.js) 的项目结构。

pdf-query-app/
├── frontend/
│   ├── public/
│   │   ├── index.html
│   ├── src/
│   │   ├── assets/
│   │   ├── components/
│   │   │   └── PdfUploader.vue
│   │   ├── App.vue
│   │   ├── main.js
│   ├── package.json
│   ├── vue.config.js
├── backend/
│   ├── uploads/         // 存放上传的临时文件
│   ├── server.js        // 主服务器文件
│   ├── package.json     // Node.js 项目的依赖配置
├── elasticsearch/
│   └── docker-compose.yml  // Elasticsearch 配置(可选)

1. 初始化 Node.js 项目

首先,确保你已经安装了 Node.js 和 npm。如果没有,请从 Node.js 官方网站 下载并安装。

创建项目目录
mkdir pdf-query-backend
cd pdf-query-backend
初始化项目

使用 npm 初始化项目,这将创建一个 package.json 文件。

npm init -y

2. 安装依赖

安装 Express 框架、Multer 中间件、pdf-parse 库和 Elasticsearch 客户端库。

npm install express multer pdf-parse @elastic/elasticsearch

3. 创建项目目录结构

设置项目目录结构,确保目录结构清晰,易于维护。

pdf-query-backend/
├── uploads/               # 存放上传的临时文件
├── routes/
│   └── pdfRoutes.js       # 路由文件
├── server.js              # 主服务器文件
├── package.json           # 项目依赖配置
├── package-lock.json      # 锁定的依赖配置

4. 创建服务器文件

server.js

创建一个主服务器文件 server.js,用于启动 Express 服务器并处理文件上传和查询请求。

const express = require('express');
const multer = require('multer');
const pdfParse = require('pdf-parse');
const { Client } = require('@elastic/elasticsearch');
const fs = require('fs');
const path = require('path');
const pdfRoutes = require('./routes/pdfRoutes');const app = express();
const upload = multer({ dest: 'uploads/' });
const client = new Client({ node: 'http://localhost:9200' });// 使用路由
app.use('/pdf', pdfRoutes(client, upload));// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});
routes/pdfRoutes.js

创建一个新的路由文件 pdfRoutes.js,用于处理 PDF 文件上传和查询请求。

const express = require('express');
const fs = require('fs');
const pdfParse = require('pdf-parse');
const path = require('path');module.exports = (client, upload) => {const router = express.Router();// 处理文件上传router.post('/upload', upload.single('file'), async (req, res) => {try {const fileBuffer = fs.readFileSync(req.file.path);const data = await pdfParse(fileBuffer);await client.index({index: 'pdfs',body: {content: data.text,filename: req.file.originalname,uploadDate: new Date()}});fs.unlinkSync(req.file.path); // 删除临时文件res.json({ message: 'File uploaded and indexed successfully.' });} catch (error) {res.status(500).json({ error: 'Error processing file.' });}});// 处理查询请求router.get('/search', async (req, res) => {const { q } = req.query;try {const { body } = await client.search({index: 'pdfs',body: {query: {match: { content: q }}}});res.json(body);} catch (error) {res.status(500).json({ error: 'Error searching for query.' });}});return router;
};

5. 运行项目

确保 Elasticsearch 正在运行,并启动你的 Node.js 服务器。

node server.js

你的服务器现在应该在 http://localhost:3000 上运行,你可以通过 POST 请求上传 PDF 文件,通过 GET 请求查询索引内容。

6. 测试 API

上传 PDF 文件

使用 Postman 或 cURL 测试文件上传 API:

curl -X POST http://localhost:3000/pdf/upload -F 'file=@/path/to/your/file.pdf'
查询 PDF 内容

使用浏览器或 Postman 测试查询 API:

http://localhost:3000/pdf/search?q=your-query

启动

报错如下cors error:

在这里插入图片描述

在你的 Node.js 服务器上启用 CORS。你可以使用 cors 中间件来实现这一点。

解决方法

1. 安装 cors 中间件

在你的 Node.js 项目中安装 cors 中间件:

sh
复制代码
npm install cors
2. 配置 cors 中间件

server.js 中配置 cors 中间件:

const cors = require('cors');
// 启用 CORS
app.use(cors());

测试

  1. 启动后端服务器

    node server.js
    
  2. 启动前端开发服务器

    npm run serve
    
  3. 访问前端应用

    打开浏览器,访问 http://localhost:8080,上传 PDF 文件并进行查询。

    在这里插入图片描述

    文件上传成功,解析内容成功。
    在这里插入图片描述

储存在elasticsearch里面以index:pdfskey

在这里插入图片描述

但是search返回对象为null

在这里插入图片描述

分析:

1. 插件原因

Elasticsearch 中索引和搜索 PDF 文件的内容,需要安装 ingest-attachment 插件。

  1. 停止 Elasticsearch 服务:在安装插件之前,首先停止 Elasticsearch 服务。

  2. 安装插件:在命令行中运行以下命令来安装 ingest-attachment 插件:

    bin/elasticsearch-plugin install ingest-attachment
    

    这将下载并安装 ingest-attachment 插件。

  3. 重新启动 Elasticsearch 服务:安装完成后,重新启动 Elasticsearch 服务以使插件生效。

    bin/elasticsearch
    

结果报错

-> Installing ingest-attachment
[ingest-attachment] is no longer a plugin but instead a module packaged with this distribution of Elasticsearch
-> Please restart Elasticsearch to activate any plugins installed

对于elasticsearch8.13.4里面,ingest-attachment插件已经被整合为 Elasticsearch 的一个模块,并随着 Elasticsearch 分发的一部分而不是作为一个单独的插件。因此,你不需要手动安装它。

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

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

相关文章

[Qt学习笔记]Qtxlsx在Qt下的配置和调用

背景分析 Qt操作Excel文件一般有QAxObject和QtXlsx两种方法,前者需要调用wps或office组件进行读写操作,具有一定的局限性,下面列出两种方法的优缺点对比 QAxObject: 优点:支持xls和xlsx等版本。office组件读写速度快&…

Java Map遍历方法(Map的Iterator原理)

Map中存放数据的Key-Value实质上就是Node节点,而 底层是hash数组和链表(或树),不容易遍历。 一、containsKey() 和 get()查找元素 这两个方法可以获得信息,但是依旧不能轻松遍历。 containsKey()方法判断对应的key是否存在; get()…

浔川python社获得全网博主原力月度排名泸州地区第二名!

今日,浔川python社在查看全网博主原力月度排名泸州地区时,一看就震惊啦! 全网博主原力月度排名泸州地区排名榜单 全网博主原力月度排名泸州地区第二名为:浔川python社。 感谢粉丝们的支持!浔川python社还会继续努力&a…

【文献阅读】汽车上的信息安全工程

文章目录 前言 基本概念 信息安全评估 信息安全措施 测试验证 参考文献 前言 见《汽车电子——产品标准规范汇总和梳理(信息安全)》 基本概念 道路车辆信息安全 cybersecurity 使资产受到充分保护,免受道路车辆相关项、其功能及其电气或…

vue3-调用API实操-调用开源头像接口

文档部分 这边使用是开源的API 请求地址: :https://api.uomg.com/api/rand.avatar 返回格式 : json/images 请求方式: get/post 请求实例: https://api.uomg.com/api/rand.avatar?sort男&formatjson 请求参数 请求参数说明 名称必填类型说明sort否strin…

3DMAX建筑生长动画插件PolyFX安装使用方法

3DMAX建筑生长动画插件PolyFX安装使用教程 PolyFX插件是一个功能强大的工具,它可以将对象分解为片段并根据需要设置动画。它有许多用于微调动画的选项和一些附加工具。这是制作宣传视频、游戏开发等的绝佳解决方案。 【版本要求】 3ds max 2010-2025(不…

西门子电梯控制保姆级教程

一、电梯运行控制 1.电梯控制系统结构 可以理解是通过ip进行访问的 2.基于PLCSIM Adv与电梯仿真软件的控制环境搭建 虽然都是用一台电脑来控制,但是还是用以太网来连接 在FC块里面也要用两个DB块来放输入和输出 二、电梯对象的分析 在eet里面,用手动控制…

探讨大米自动化生产线包装设备的智能化发展趋势

随着科技的飞速发展,智能化已经成为各行各业转型升级的重要方向。在大米生产领域,自动化生产线包装设备的智能化发展更是引领着粮食产业的未来潮流。星派将从智能化技术、市场需求、发展趋势等方面,探讨大米自动化生产线包装设备的智能化发展…

LeetCode 算法:找到字符串中所有字母异位词c++

原题链接🔗:找到字符串中所有字母异位词 难度:中等⭐️⭐️ 题目 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符…

Python高阶学习记录

文章导读 阅读本文需要一定的python基础,部分知识点是对python入门篇学习记录和python并发编程学习记录的深入探究,本文记录的Python知识点包括函数式编程,装饰器,生成器,迭代器,正则表达式,内存…

eNSP——两台电脑通过一根网线直连通信

一、拓扑结构 二、电脑配置 ip和子网掩码,配置两台电脑处于同一网段 三、测试 四、应用 传文件等操作,可以在一台电脑上配置FTP服务器

Java零基础-顺序结构

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

高清矩阵是什么?

在数学中,矩阵是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。如图为m行n列的矩阵: 由此延伸可以想到矩阵图片是把一个三维空间分切成多个行和列的区域进行图像捕获,将捕获图像再进行拼合成为…

关于苹果发布IOS18系统,以及Siri升级贾维斯

随着科技的不断进步,手机操作系统也在持续升级,为用户提供更加智能化、便捷化的体验。近期,苹果公司即将推出的iOS 18系统引起了广泛关注。作为iPhone历史上的重大更新,iOS 18系统带来了众多新功能,将进一步提升iPhone…

2024-6-2 石群电路-21

2024-6-2,星期日,天气:阴,心情:晴。今天没什么特别的事情发生,心情还是一如既往的好,明天就周一啦,虽然我暂时不用上班,但是希望大家新的一周元气满满~ 今日观看了石群老…

STL中vector动态二维数组理解(杨辉三角)

题目链接&#xff1a;118.杨辉三角 题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目指要&#xff1a; 本题的主要目的是理解vector<vector<int&…

18 跨团队 没有汇报线的人和事就是推不动?

在“05 | 大项目&#xff1a;把握关键点&#xff0c;谋定而后动”和“11 | 勤沟通&#xff1a;在信任的基础上&#xff0c;让沟通简单”两讲中&#xff0c;我提过“跨团队”这件事&#xff0c;很多同学带团队之后&#xff0c;无法回避的一个问题就是“跨团队协作”&#xff0c;…

2024/6/2 英语每日一段

However, they denied Hirst had been deliberately misleading, arguing that it was his “usual practice” to date physical works in a conceptual art project with the date of the project’s conception, which in the case of The Currency was 2016. Hirst and Sci…

Python | 自动探索性数据分析(EDA)库SweetViz

SweetViz是一个开放源代码Python库&#xff0c;主要用于生成精美的高密度可视化文件&#xff0c;启动探索性数据分析&#xff08;EDA&#xff09;&#xff0c;输出为完全独立的HTML应用程序。 探索性数据分析&#xff08;EDA&#xff09;是分析和总结数据集主要特征的过程&…

AOP案例

黑马程序员JavaWeb开发教程 文章目录 一、案例1.1 案例1.2 步骤1.2.1 准备1.2.2 编码 一、案例 1.1 案例 将之前案例中增、删、改相关节后的操作日志记录到数据库表中。 操作日志&#xff1a;日志信息包含&#xff1a;操作人、操作时间、执行方法的全类名、执行方法名、方法…