【问题标题】:Reload Express Server after File Upload文件上传后重新加载 Express 服务器
【发布时间】:2021-06-24 01:05:09
【问题描述】:

这是我最基本的快递服务器

const express = require("express")
const fileUpload = require("express-fileupload")
const cors = require("cors")
const morgan = require("morgan")
const fs = require('fs')

const app = express()

app.use(fileUpload({
  createParentPath: true
}))

app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(morgan("dev"));

var result;

const XMLFileExists = fs.existsSync("uploads/uploadedXMLFile.xml") ? true : false;
const uploadFile = () => {

  app.post("/fileUpload", async (req, res) => {
    try {
      if(!req.files){
        res.send({
          status: false,
          message: "No files"
        })
      } else {
        const {XMLFile} = req.files
        XMLFile.mv("./uploads/" + "uploadedXMLFile.xml")
        res.send({
          status: true,
          message: "File is uploaded"
        }) 
      }
    } catch (e) {
      res.status(500).send(e);
    }
  })
}

const runReader = () => {
  // uploadFile()
  if(XMLFileExists){
    result = fs.readFileSync("uploads/uploadedXMLFile.xml", "utf-8");
    app.get('/fileReader', (req, res) => res.send(result));
  }
}

uploadFile()
runReader()

const port = process.env.PORT || 5000

app.listen(port, () => console.log(`Server is running on port ${port}`))

如您所见,它有两个功能。一个负责处理名为uploadFile() 的文件的上传,另一个负责读取名为runReader() 的文件。

过程

我上传了一个文件 => 将其保存到目录中的 upload/ => 文件被读取并在 localhost:5000/fileReader 处可用,供前端访问。

问题是,每当我上传一个file1,然后是一个新的file2,即使使用nodemon,服务器也不会重新加载,而localhost 可用的是file1。

当我手动为 nodemon 执行 Ctrl + S 以重新启动服务器时,它得到了修复。 我想在文件上传时重新启动服务器,以便在localhost 获得最新文件

【问题讨论】:

  • 我可以在我的代码中添加一些东西以使服务器以编程方式重新启动吗?
  • 上传后直接运行runReader
  • @ThomasSablik 由于某种原因不起作用。我对后端很陌生,所以我不知道为什么会这样
  • 您正在向路由注册一个函数。我以为您可以覆盖该功能。上传后可以更新result
  • @ThomasSablik 你能告诉我怎么做吗?

标签: javascript node.js express server


【解决方案1】:

中间件之外的所有代码在服务器启动时执行一次。

所以移动const XMLFileExists = fs.existsSync("uploads/uploadedXMLFile.xml") ? true : false;

进入 readXMLFile 函数就不需要重启服务器了。

【讨论】:

    【解决方案2】:

    这实际上是我的错,我不知道中间件是如何工作的。 我看了this 的视频,它完全解决了我的问题。

    下面的这个解决方案对我有用。我忘了在实际答案中添加这个。

    const express = require("express")
    const fileUpload = require("express-fileupload")
    const cors = require("cors")
    const morgan = require("morgan")
    const fs = require('fs')
    
    const app = express()
    
    
    const XMLFileExists = fs.existsSync("uploads/uploadedXMLFile.xml") ? true : false;
    
    app.use(fileUpload({
      createParentPath: true
    }))
    
    app.use(cors());
    app.use(express.json());
    app.use(express.urlencoded({ extended: true }));
    app.use(morgan("dev"))
    
    
    app.post("/fileUpload", (req, res) => {
      try {
        if(!req.files){
          res.send({
            status: false,
            message: "No files"
          })
        } else {
          const {XMLFile} = req.files
          
          XMLFile.mv("./uploads/" + "uploadedXMLFile.xml")
          res.send({
            status: true,
            message: "File is uploaded"
          })
        }
      } catch (e) {
        res.status(500).send(e);
      }
    })
    
    
    function readXMLFile (req, res, next) {
    
      if(XMLFileExists){
         res.result = fs.readFileSync("uploads/uploadedXMLFile.xml", "utf-8");
        console.log('text online')
      }
      next()
    }
    
    app.get('/fileReader', readXMLFile, (req, res) => res.send(res.result));
    
    const port = process.env.PORT || 5000
    
    app.listen(port, () => console.log(`Server is running on port ${port}`))
    
    

    我在想中间件中的函数就像普通函数一样工作。那不是真的。每个函数都是一个中间件。 当你读到中间件的时候,这个概念里有三个东西 => req, resnext

    每个中间件都会收到一个req(请求)并发送一个res(响应)。然后他们可以调用next(),如果他们想让数据转到下一个函数并修改数据。它从顶部开始,并通过我们发送回响应的每个中间件到达底部。中间件的顺序很重要。

    【讨论】:

    猜你喜欢
    • 2014-11-19
    • 1970-01-01
    • 2019-05-16
    • 2012-09-10
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多