是什么导致我的请求超时?

时间:2018-08-09 02:46:54

标签: node.js express promise es6-promise multer

我正在尝试创建一条路线,该路线允许用户上传一个csv文件,然后将其异步解析为Json并为每行实例化一个模型。我试图使用promises来做到这一点,但是函数请求一直保持超时,我看不到它在哪里中断。这是代码(/ 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 个答案:

答案 0 :(得分:1)

您需要执行以下操作:

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

请注意resolve()。这是关键,因为您没有对该Promise做任何事情。