(Express js)我应该如何在我的路由器中使用另一个模块? (我不断收到未定义的参考错误)

Posted

技术标签:

【中文标题】(Express js)我应该如何在我的路由器中使用另一个模块? (我不断收到未定义的参考错误)【英文标题】:(Express js) How should I use another module in my router? (I keep getting undefined reference error) 【发布时间】:2021-12-31 02:15:04 【问题描述】:

我正在制作一个简单的 pdf 阅读器应用程序(使用 Mozilla 的 pdf.js 库),用户选择文件,然后网站自动转到 /reader 页面,然后显示 pdf,但我不知道我应该如何将该 pdf 文件实际传输到我的其他页面,我试过这样做:

这是我的 server.js

import express from 'express';
const app = express();
import router from '../routes/reader.js';
const port = 5500;
const ip = '127.0.0.1';
app.set('view engine', 'ejs');

app.use('/css', express.static('css'));
app.use('/node_modules', express.static('node_modules'));
app.use('/js', express.static('js'));
app.use('/docs', express.static('docs'));
app.use('/reader', readerRouter);

app.get('/', (req, res) => 
  res.render('index')
);

app.listen(port, IP);

这是我从输入中获取文件并将其发送到指定 URL 的地方,这是我使用脚本标签添加到主页的脚本

uploadInput.onchange = (e) => 
  let file = e.target.files[0];
  let fd = new FormData();
  fd.append(uploadInput, file);

  $.ajax(
    url: '/reader',
    method: 'POST',
    data: fd,
    cache: false,
    processData: false,
    contentType: 'application/pdf'
  ).done(() => 
    window.location.href = '/reader';
  );

在我的 /reader 路由器中,我这样做了:

const express = require('express');
import showPdf from '../js/pdf.js';
const router = express.Router();

router.get('/', (req, res) => 
  res.render('reader');
);

router.post('/', (req, res) => 
  res.redirect('/reader');
  showPdf(req.body);
);

export default router;

我无法轻松导入 pdf.js 脚本,它会抛出一个错误,说我不能在模块之外使用导入等...我是 node.js 的新手,我不知道如何这些模块可以工作,我应该如何正确导入和使用它们,但是在尽我所能解决导入问题之后,现在我在我的 pdf.js 脚本中收到一个错误消息,指出 pdfjsLib is not defined

这是 pdf.js 脚本:

pdfjsLib.GlobalWorkerOptions.workerSrc = '../node_modules/pdfjs-dist/build/pdf.worker.js';
    
const eventBus = new pdfjsViewer.EventBus();
const pdfLinkService = new pdfjsViewer.PDFLinkService( eventBus );

// Get document
function showPdf(file) 
  let fileReader = new FileReader();

  fileReader.readAsArrayBuffer(file);

  fileReader.onload = () => 
    let typedArray = new Uint8Array(this.result);
    
    pdfjsLib.getDocument(typedArray).promise.then(function (_pdfDoc) 
      pdfDoc = _pdfDoc;
    );
  

它比这大得多,但这是我使用 pdfjsLib 和 pdfjsViewer 的方式,我在 html 脚本标签中的 pdf.js 脚本之前导入它们。

为什么找不到 pdfjsLib 和 pdfjsViewer?路由器在我的网站上的什么位置?这是因为路由器无法访问 pdfjsLib 全局变量吗?我应该如何使用依赖于像这样的一些全局变量的脚本?这种方法完全正确吗?我的意思是从输入中传输选定的文件并将其发布到我的其他页面。

【问题讨论】:

我看不到您在哪里导入 pdfjsLibpdfjsViewer... 您提到“在您的 HTML 脚本标签之前导入它们”但那将是客户端...您在说关于服务器端的node.js......这里有些东西还没有意义。 我应该在哪里导入这些文件?我尝试将它们导入到我的 pdf.js 文件中,然后 pdfjsLib 和 pdfjsViewer 的错误消失了,但是其他一些错误是说其他一些东西是未定义的,这与这两个文件的内部工作有关,我会测试再次他们,我会让你知道错误到底是什么意思 这是错误:node_modules\pdfjs-dist\web\pdf_viewer.js:2081 document.webL10n = function (window, document, undefined) ReferenceError: document is not defined ... 那么看起来pdfjs-dist 是用于客户端代码的。您不能在服务器端代码中使用它。它假定它在浏览器中运行。 对不起,我完全是网络开发的菜鸟,你的意思是我不能像我上面描述的那样做一个应用程序?并且没有办法获取该文件并将其提供给 pdfjsLib? 【参考方案1】:

您正在导出一个名为 router 的变量,然后在导入中查找 readrouter。将导入更改为:

import router from '../routes/reader.js

对于 pdfjsLib,我看不到您在哪里导入该库。因此,您只需导入 pdfjsLib 库即可对路由器执行相同的操作。如果您使用的是this package 它:

import pdfjsLib from 'pdfjs-dist'

【讨论】:

感谢指点,我改了好多次,这次都忘记了,可惜还是没解决,还是收到ReferenceError: pdfjsLib is not defined 我已经更新了我的答案以尝试和帮助。 不,这个 pdfjs 来自 mozilla:github.com/mozilla/pdf.js 我已经将它们添加到我的 html 脚本标签中,直到我将我的 pdf.js 脚本导入我的路由器脚本之前,它们都可以正常工作 你在客户端导入它,需要一个库在你的服务器上处理它

以上是关于(Express js)我应该如何在我的路由器中使用另一个模块? (我不断收到未定义的参考错误)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Express 的多个文件中包含路由处理程序? [复制]

如何在 Nuxt 中使路由区分大小写

如何在我的项目中使角度材料 DIALOG 可共享?

解析服务器:自定义端点/快速路由

如何将参数传递给 MEAN.js 包的 express.js 服务器端路由。

请求新页面时如何将 AngularJS 路由与 Express (Node.js) 一起使用?