代码之家  ›  专栏  ›  技术社区  ›  adam tropp

什么原因导致我的请求超时?

  •  0
  • adam tropp  · 技术社区  · 6 年前

    我试图创建一个允许用户上传csv文件的路由,然后异步地将文件解析为Json并为每一行实例化一个模型。我试过使用承诺来实现这一点,但是函数请求总是超时,我看不到它在哪里被破坏。下面是代码(/app/index):

    const csv=require('csvtojson');
    const multer  = require('multer');
    const upload = multer().single(); 
    
    router.post('/distributor/:id/upload', (req,res) => { 
      return new Promise((resolve, reject) => {
        upload(req,res,function(err){
          if(err !== null) return reject(err);
          resolve();
        });
      })
      .then((req, res) => {
        return csv()
        .fromString(req.body.toString('utf8'))
        .on('json', (item) => { 
          item.distributor_id = req.params.id 
          Product
          .forge(item.body)
          .save()
          .then((product) => {
            res.json({id: product.id});
          })
          .catch((error) => {
            console.error(error);
            return res.sendStatus(500);
          })
        })
        .on('done', () => { 
          console.log('done parsing'); 
          resolve();
        });
      }) 
    })
    

    以下是我将文件投递到此路由时heroku日志的输出:

    (node:49) UnhandledPromiseRejectionWarning: Unhandled promise rejection 
    (rejection id: 2): undefined
    2018-08-09T03:57:17.240599+00:00 app[web.1]: (node:49) [DEP0018] 
    DeprecationWarning: Unhandled promise rejections are deprecated. In the 
    future, promise rejections that are not handled will terminate the Node.js 
    process with a non-zero exit code.
    2018-08-09T03:57:47.205596+00:00 heroku[router]: at=error code=H12 
    desc="Request timeout" method=POST path="/api/distributor/1/upload" host=fba- 
    prof-prods.herokuapp.com request_id=40e1864b-fa71-49aa-8fdf-cedb1752edef 
    fwd="73.92.68.83" dyno=web.1 connect=1ms service=30284ms status=503 bytes=0 
    protocol=https
    

    如果您能给我指出任何资源/例子,其中类似的事情是正确的(处理上传和异步解析一个大型csv文件),我也会非常感谢。我不知所措,如何做到这一点,似乎找不到任何好的资源!谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Akrion    6 年前

    你需要这样做:

    function uploadAsync(req,res){
        return new Promise((resolve, reject) => {
             upload(req,res,function(err){
                 if(err !== null) return reject(err);
                 resolve();
             });
        });
    }
    

    注意 resolve() . 这是关键,因为你没有做任何承诺。