【问题标题】:Page refresh before the express - Node js function endsexpress-Node js函数结束前页面刷新
【发布时间】:2021-05-25 18:15:52
【问题描述】:

我有以下功能,它适用于可以在几秒钟内上传的小文件,但对于大文件,页面刷新没有快速 js 上的 axios 发布请求结束。我正在使用 React Js 。 SO下面是客户端服务器反应js,它向同域中的端口9000发出axios请求

 function handleUpload (event)  {
    event.preventDefault();
    var language=props.selectedlan.selectedlan;
    var data = language === LAN_EN?jsonEN.deliverablePage:jsonGR.deliverablePage;
    
    if (projectName==='' || selectPerc === null) {
      setMessage(data.page.value16);
      return;
    }
    else if (!(selectPerc <=100 && selectPerc >=0)) {
      setMessage(data.page.value17);
      return;
    }
    else if (maxGrade < 0 ) {
      setMessage(data.page.value18);
      return;
    }
    setMessage('' );
    const dataFile = new FormData();
    dataFile.append('file', selectedFile);
    dataFile.append('id', props.loginsession.ID);
    dataFile.append('name', projectName);
    dataFile.append('startDate', selectedSDate);
    dataFile.append('finishDate', selectedFDate);
    dataFile.append('percentage', selectPerc);
    dataFile.append('max', maxGrade);
    dataFile.append('appear', checkedB);
    axios
      .post('http://10.16.33.114:9000/createDeliverable', dataFile, {
        onUploadProgress: (ProgressEvent) => {
          setloaded(Math.round(
            (ProgressEvent.loaded / ProgressEvent.total) * 100
          ));
        }
      }).then(    setselectedFile(null))
      .then(
        setMessage(data.page.value19))
.then(setTimeout(function(){ window.location.replace('/app/deliverables?createDeliverable=1'); }, 2000));
  };

下面我们可以看到调用axios post的express js中的Server端:


  fs.readdir(`${process.cwd()}/public/uploads/DeliverablesDocumentInfo/`, (err, files) => {
      con.getConnection(function(err, connection) {
        //Select all customers and return the result object:
        if(req.body.file !== 'null' ){

          let uploadFile = req.files.file;
          const name = uploadFile.name;
        
          con.query('INSERT INTO deliverables (Title,StartDate,FinishDate,Percentage, MaxGrade,Appear) VALUES (?,?,?,?,?,?)',[projectName,start, finish,percentage, max,appear], async function (err, result, fields) {
            connection.release();
  
            if (err) throw err;
          
            var insertedID = result.insertId;
            let ex = name.split(".")[1];
            const saveAs = insertedID+"." + ex;
          
            uploadFile.mv(`${process.cwd()}/public/uploads/DeliverablesDocumentInfo/${saveAs}`, function(err) {
             if (err) {
              // return res.status(500).send(err);
             }
             });
             con.query("UPDATE deliverables SET FileData = ? WHERE IDDeliverable = ?",[saveAs,insertedID], function (err, result) {
               if (err) throw err;
             });
        });
        }
        else{

            con.query('INSERT INTO deliverables (Title,StartDate,FinishDate,Percentage, MaxGrade,Appear) VALUES (?,?,?,?,?,?)',[projectName,start, finish,percentage, max,appear], async function (err, result, fields) {
                connection.release();
                if (err) throw err;      
            });
            }
      res.status(200);
    });

【问题讨论】:

    标签: javascript node.js reactjs express axios


    【解决方案1】:

    您应该将函数传递给then。您的代码在 post 启动时创建 2 秒超时,而不是在它完成时。

    修正版:

    function handleUpload (event)  {
        event.preventDefault();
        var language=props.selectedlan.selectedlan;
        var data = language === LAN_EN?jsonEN.deliverablePage:jsonGR.deliverablePage;
        
        if (projectName==='' || selectPerc === null) {
          setMessage(data.page.value16);
          return;
        }
        else if (!(selectPerc <=100 && selectPerc >=0)) {
          setMessage(data.page.value17);
          return;
        }
        else if (maxGrade < 0 ) {
          setMessage(data.page.value18);
          return;
        }
        setMessage('' );
        const dataFile = new FormData();
        dataFile.append('file', selectedFile);
        dataFile.append('id', props.loginsession.ID);
        dataFile.append('name', projectName);
        dataFile.append('startDate', selectedSDate);
        dataFile.append('finishDate', selectedFDate);
        dataFile.append('percentage', selectPerc);
        dataFile.append('max', maxGrade);
        dataFile.append('appear', checkedB);
        axios
          .post('http://10.16.33.114:9000/createDeliverable', dataFile, {
            onUploadProgress: (ProgressEvent) => {
              setloaded(Math.round(
                (ProgressEvent.loaded / ProgressEvent.total) * 100
              ));
            }
          })
          .then(() => setselectedFile(null))
          .then(() => setMessage(data.page.value19))
          .then(() => setTimeout(function(){ window.location.replace('/app/deliverables?createDeliverable=1'); }, 2000));
      };
    

    【讨论】:

    • 我试试看。它成功上传了文件,但页面没有刷新。就像没有人'然后'它被编译了
    • 看来应该先看看promise链有没有错误。您可以尝试在末尾添加.catch 以确保setselectedFilesetMessage 正常工作。
    • 如果手动刷新页面,我可以看到上传的文件和创建的记录。但是,当我单击按钮上传时,它会以 100% 堆叠,但没有刷新,也没有出现任何消​​息(3 ()=> .. 中没有一个会执行)
    • 那么我的下一个猜测是服务器没有正确结束请求。仅通过一点客户端代码就很难知道发生了什么。也许在服务器端发布处理程序。
    • 我也加了客户端服务器
    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2017-12-07
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多