Node.js 从res.send csv文件捕获AngularJS函数中的响应

Node.js 从res.send csv文件捕获AngularJS函数中的响应,node.js,angularjs,json2csv,Node.js,Angularjs,Json2csv,我需要从NodeJS函数捕获响应(我的意思是检查NodeJS函数的响应何时返回到客户端,而不是像错误一样)。 单击按钮时,将启动一个带有表单的函数,并在查询后返回一个csv文件。问题是查询很复杂,需要1分钟以上的时间才能完成 我需要在单击按钮时启动加载微调器,并在CSV从函数返回时停止。有没有关于我该怎么做的线索?提前谢谢 HTML表单 特许经营区* 安诺* 斯卡里卡 棱角的 $scope.download = function () { var form = document.cr

我需要从NodeJS函数捕获响应(我的意思是检查NodeJS函数的响应何时返回到客户端,而不是像错误一样)。
单击按钮时,将启动一个带有表单的函数,并在查询后返回一个csv文件。问题是查询很复杂,需要1分钟以上的时间才能完成

我需要在单击按钮时启动加载微调器,并在CSV从函数返回时停止。有没有关于我该怎么做的线索?提前谢谢

HTML表单


特许经营区*
安诺*
斯卡里卡
棱角的

$scope.download = function () {

   var form = document.createElement('form');
   form.action = apihost + "/queryReport/avanzEvaluation"; 
   form.method = 'POST';
   form.target = '_blank';
   form.style.display = 'none';

   var jsonData = {
      dealer: $scope.Dealer,
      year: $scope.Year
   };

   var inputJson = document.createElement('input');
   inputJson.type = 'text';
   inputJson.name = 'data';
   inputJson.value = JSON.stringify(jsonData);

   var submit = document.createElement('input');
   submit.type = 'submit';
   submit.id = 'submitProject';
   form.appendChild(inputJson);
   form.appendChild(submit);
   document.body.appendChild(form);

   //Send form.
   form.submit();
   document.body.removeChild(form);
};
NodeJS

router.post('/avanzEvaluation', function (req, res) {
    return new Promise(function(resolve,reject) {

        //Not the real query, just an example
        var sql = "SELECT * FROM Table ";

        return models.sequelize.query(sql, {replacements: replacements, type: models.sequelize.QueryTypes.SELECT })
        .then(function (results) {

            const Json2csvParser = require('json2csv').Parser;

            //Not real fields, just examples
            const fields = ["Field1", "Field2", "Field3", "Field4",];

            const opts = { fields };

            try {
                const parser = new Json2csvParser(opts);
                const csv = parser.parse(results);
                var filename = ("avanzValutazioni.csv");

                res.header("Content-Disposition","attachment;filename=" + filename); 
                res.setHeader('content-type', 'text/csv');
                res.send(iconv.encode(csv, 'iso-8859-1'));
            }
            catch (err) {
                console.error(err);
            }
        })
        .catch(function (err) {
            console.log(err);
        }); 
    })
});
router.post('/avanzEvaluation_TEST', function (req, res) {
    return new Promise(function(resolve,reject) {

        //Not the real query, just an example
        var sql = "SELECT * FROM Table ";

        return models.sequelize.query(sql, {replacements: replacements, type: models.sequelize.QueryTypes.SELECT })
        .then(function (results) {

            const Json2csvParser = require('json2csv').Parser;

            //Not real fields, just examples
            const fields = ["Field1", "Field2", "Field3", "Field4",];

            const opts = { fields };

            try {
                const parser = new Json2csvParser(opts);
                const csv = parser.parse(results);
                var filename = ("avanzValutazioni.csv");

                res.json({filename: filename, csv: csv});
            }
            catch (err) {
                console.error(err);
            }
        })
        .catch(function (err) {
            console.log(err);
        }); 
    })
});

要使用http服务启动和停止微调器,请使用
$http
承诺的
.finally
方法:

 $scope.spinner = true;
 var promise = $http.post(url, data);
 promise.finally(function() {
     $scope.spinner = false;
 });

有关详细信息,请参阅


    • 多亏了@georgeawg,我才知道该怎么做
      我通过返回一个带有文件名和完整csv(csv格式)的json来解决问题,而无需将其从NodeJS函数下载到前端。然后,我在前端操纵结果以触发csv下载

      安格拉斯

      $scope.download = function () {
         //Spinner
         usSpinnerService.spin('spinner-1');
      
         //Custom data from the Form, sent as a JSON
         var jsonData = {
            year: $scope.Year
         };
         if($scope.Dealer) {
            jsonData.dealer = $scope.Dealer;
         }
      
         //I've could have done this with a options variable, but i prefer it inline
         $http.post(apihost + "/queryReport/avanzEvaluation_TEST", {data: jsonData}, {headers: {'Content-Type': 'application/json'}})
         .success(function (result) {
      
            //If the query returns a non-empty csv
            if(result.csv.length > 0) {
               usSpinnerService.stop('spinner-1');
      
               //This if-else is used to make it work on Edge too
               if (window.navigator.msSaveOrOpenBlob) {
                  var blob = new Blob([result.csv]);
                  window.navigator.msSaveOrOpenBlob(blob, result.filename);
               } 
               else {
                  var a = document.createElement("a");
                  a.href = "data:attachment/csv," +  encodeURIComponent(result.csv);
                  a.target = "_blank";
                  a.download = result.filename;
                  document.body.appendChild(a);
                  a.click();
               }
            }
            //Otherwise I show an error with the module Notification
            else {
               Notification.error("Non è stato possibile eseguire il download del file CSV.");
            }       
         });
      }
      
      NodeJS

      router.post('/avanzEvaluation', function (req, res) {
          return new Promise(function(resolve,reject) {
      
              //Not the real query, just an example
              var sql = "SELECT * FROM Table ";
      
              return models.sequelize.query(sql, {replacements: replacements, type: models.sequelize.QueryTypes.SELECT })
              .then(function (results) {
      
                  const Json2csvParser = require('json2csv').Parser;
      
                  //Not real fields, just examples
                  const fields = ["Field1", "Field2", "Field3", "Field4",];
      
                  const opts = { fields };
      
                  try {
                      const parser = new Json2csvParser(opts);
                      const csv = parser.parse(results);
                      var filename = ("avanzValutazioni.csv");
      
                      res.header("Content-Disposition","attachment;filename=" + filename); 
                      res.setHeader('content-type', 'text/csv');
                      res.send(iconv.encode(csv, 'iso-8859-1'));
                  }
                  catch (err) {
                      console.error(err);
                  }
              })
              .catch(function (err) {
                  console.log(err);
              }); 
          })
      });
      
      router.post('/avanzEvaluation_TEST', function (req, res) {
          return new Promise(function(resolve,reject) {
      
              //Not the real query, just an example
              var sql = "SELECT * FROM Table ";
      
              return models.sequelize.query(sql, {replacements: replacements, type: models.sequelize.QueryTypes.SELECT })
              .then(function (results) {
      
                  const Json2csvParser = require('json2csv').Parser;
      
                  //Not real fields, just examples
                  const fields = ["Field1", "Field2", "Field3", "Field4",];
      
                  const opts = { fields };
      
                  try {
                      const parser = new Json2csvParser(opts);
                      const csv = parser.parse(results);
                      var filename = ("avanzValutazioni.csv");
      
                      res.json({filename: filename, csv: csv});
                  }
                  catch (err) {
                      console.error(err);
                  }
              })
              .catch(function (err) {
                  console.log(err);
              }); 
          })
      });
      

      对于AngularJS框架,人们通常使用从服务器获取数据。@georgeawg我尝试使用http,但它是一样的…使用
      res.send
      剪切响应,因此我仍然无法在前端获得响应…但是我找不到如何交替使用
      json2csv
      和AngularJS框架,最好让服务器以JSON的形式发送数据。你是说所有这些都是黑客行为,因为你不知道如何编写nodeJS代码来正确响应HTTP请求吗?@georgeawg我不是这么说的。我已经毫无问题地完成了其他http请求。问题不在于请求,而在于响应。使用从查询中检索的数据动态创建csv,我能够正确下载它。问题是,我不知道如何在前端获得响应(我需要它作为加载微调器,当csv准备就绪时,微调器停止)…try方法的最后3行不会在前端发送响应,但这就是我发现如何在几乎所有我知道如何做的地方都这样做的方式,我只是在回答中发布了它…感谢帮助:)