制作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 分发的一部分而不是作为一个单独的插件。因此,你不需要手动安装它。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python3 match-case 语句

前言 本文主要介绍match-case语句与switch-case的区别,及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…

C++20实战之channel

C20实战之channel 继前面两节的直播,讲解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法与底层实现,那么如何基于这些知识实现一个小项目呢? 于是引出了这篇,写一个channel出来。 注&#xff1a…

Python-算法编程100例-双指针(入门级)

1、盛水最多的容器 from typing import Listclass Solution:def maxArea(self, height: List[int]) -> int:# 双指针初始化l 0r len(height) - 1max_area 0# 循环终止条件while l < r:# 指针调整条件if height[l] < height[r]:# 指针调整前计算中间值max_area max…

FreeRTOS基础(四):静态创建任务

上一篇博客&#xff0c;我们讲解了FreeRTOS中如何动态创建任务&#xff0c;那么这一讲&#xff0c;我们从实战出发&#xff0c;规范我们在FreeRTOS下的编码风格&#xff0c;掌握静态创建任务的编码风格&#xff0c;达到实战应用&#xff01; 目录 一、空闲任务和空闲任务钩子…

决定短视频打开率的要素:成都鼎茂宏升文化传媒公司

​ 在当下这个短视频盛行的时代&#xff0c;无论是个人创作者还是企业品牌&#xff0c;都希望通过短视频平台获得更多的曝光和关注。然而&#xff0c;如何让自己的短视频在众多内容中脱颖而出&#xff0c;吸引用户的点击和观看&#xff0c;成为了摆在我们面前的重要问题。成都…

【爬虫工具】油管视频批量采集软件

一、背景介绍 1.1 爬取目标 我用Python独立开发了一款爬虫软件&#xff0c;作用是&#xff1a;通过搜索关键词采集ytb的搜索结果&#xff0c;包含14个关键字段&#xff1a;关键词,页码,视频标题,视频id,视频链接,发布时间,视频时长,频道名称,频道id,频道链接,播放数,点赞数,评…

开源模型应用落地-LangSmith试炼-入门初体验-监控和自动化(五)

一、前言 在许多应用程序中&#xff0c;特别是在大型语言模型(LLM)应用程序中&#xff0c;收集用户反馈以了解应用程序在实际场景中的表现是非常重要的。 LangSmith可以轻松地将用户反馈附加到跟踪数据中。通常最好提供一个简单的机制(如赞成和反对按钮)来收集用户对应用程序响…

工控一体机5寸显示器电容触摸屏(YA05WK)产品规格说明书

如果您对工控一体机有任何疑问或需求&#xff0c;或者对如何集成工控一体机到您的业务感兴趣&#xff0c;可移步控芯捷科技。 一、硬件功能介绍 YA05WK是我公司推出的一款新型安卓屏&#xff0c;4核Cortex-A7 架构&#xff0c;主频1.2GHz的CPU。采用12V供电&#xff0c;标配5寸…

使用QT生成二维码的两种方式

目录 使用QRenCode生成二维码编译生成QRenCode库使用QRenCode结果演示优缺点&#xff1a; 使用QZXing进行二维码的编码和解码编译源码使用QZXing库运行结果优缺点 使用QRenCode生成二维码 编译生成QRenCode库 QRenCode开源库 下载好之后使用cmake-gui打开进行构建生成。 点击…

mathtype7.0产品密钥及2024最新软件激活教程步骤

在数字化教育日益普及的今天&#xff0c;如何有效利用技术工具来提高数学学习的效率和质量&#xff0c;成为了教育工作者和学生共同关注的热点。特别是在处理复杂的数学公式、符号以及方程式时&#xff0c;传统的输入方式往往费时费力&#xff0c;且容易出错。为此&#xff0c;…

如何用python做一个用户登录界面——浔川python社

1 需解决的问题&#xff1a; 1.1如何用python做一个用户登录界面&#xff1f; 1.2需要用到哪些库、模块&#xff1f; 2 问题解决&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;无标准回答。 2.2 回答 1.2 &#xff1a;tk库&#xff08;缩写&#xff09;、GUL界面…

redis基础学习

redis是一个键值对类型的NoSql类型的数据库。 NoSql&#xff08;Non-relational SQL的缩写&#xff0c;也有人看作是not only sql的缩写&#xff09;型数据库&#xff0c;具有以下特征&#xff1a; 1、非结构化&#xff1a;几乎没有约束&#xff0c;约束很少&#xff0c;这要看…

【LLM】两篇多模态LLM综述MultiModal Large Language Models

note &#xff08;一&#xff09;现有的 MM-LLM 的趋势&#xff1a; (1)从专门强调 MM 理解对特定模态的生成的进展&#xff0c;并进一步演变为任何到任何模态的转换&#xff08;例如&#xff0c;MiniGPT-4 → MiniGPT-5 → NExT-GPT&#xff09;&#xff1b; (2) 从 MM PT 提…

神经网络与深度学习——第7章 网络优化与正则化

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第7章 网络优化与正则化 网络优化与正则化 网络优化 网络结构多样性 高维变量的非凸优化 神经网络优化的改善方法 优化算法 小批量梯度下降 批量大小选择 学习率调整 学习率衰减 学习率预热 周期性学习率调…

装甲车启动电源的安全性能分析

装甲车辆启动电源是一种为装甲车辆提供启动动力的专业设备。它通常被用于 火箭兵 、步兵战车、装甲运兵车等JS车辆&#xff0c;这些车辆通常需要较高的启动功率来启动其发动机&#xff0c;尤其是装甲车的发动机&#xff0c;由于其功率大&#xff0c;启动对电力要求很高。在现代…

3DMAX一键虚线图形插件DashedShape使用方法

3DMAX一键虚线图形插件使用方法 3dMax一键虚线图形插件&#xff0c;允许从场景中拾取的样条线创建虚线形状。该工具使你能够创建完全自定义的填充图案&#xff0c;为线段设置不同的材质ID&#xff0c;并在视口中进行方便的预览。 【版本要求】 3dMax 2012 – 2025&#xff08;…

HarmonyOS应用开发学习历程(1)初识DevEco Studio

1.create project Bundle name&#xff1a;包名&#xff0c;标识应用程序&#xff0c;默认应用ID也使用该名 Compile SDK&#xff1a;编译时API版本 2.工程目录 AppScope&#xff1a;应用全局所需资源 entry&#xff1a;应用的主模块&#xff0c;含代码、资源 hvigor&#…

Java多线程问题

线程 何为线程&#xff1a;线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源&#xff0c;但每个线程有自己的程序计数器、虚拟机栈和本地方法栈&#xff0c;所以系统在产生一个线程&#xf…

OSEK错误处理及跟踪调试

1 前言 如表1所示&#xff0c;OSEK提供了一些特殊的钩子例程&#xff08;Hook routines&#xff09;&#xff0c;应用层可以在钩子函数中自定义操作&#xff0c;以参与到操作系统的内部处理中。 表1 钩子函数类型 钩子函数例程功能用途ErrorHook用于错误处理StartupHook在系统启…

【论文复现|智能算法改进】基于多策略麻雀搜索算法的机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.改进点 改进的无限折叠迭代混沌映射 无限折叠迭代映射(ICMIC) 常用于图像加密方向的研究, 基本思想是首先生成[0,1]之间的混沌序列, …