【问题标题】:Does async.series/async.waterfall work inside post method?async.series/async.waterfall 在 post 方法中工作吗?
【发布时间】:2018-07-02 23:03:57
【问题描述】:

我在我的 post 方法中使用了 async.series,但它似乎不起作用,当调用 post 请求时页面显示 404 not found。

router.route('/brandinsert')
.post((req, res, next) => {
    console.log("inside post"); //terminates here
    async.series({
        one: (callback) => {
            uploadImageOne(req, res, (err) => {
                console.log('Inside uploadImageOne');
                callback(req, res, err);
            });
        },

        two: (callback) => {
            uploadImageTwo(req, res, (err) => {
                console.log('Inside uploadImageTwo');
                callback(req, res, err);
            });
        },
    }, (req, res, err) => {
         console.log('Inside req,res,err'); //does not reach here
        if(err){
            console.log('error :' + err); //does not reach here
            if (err == 'Error: imageExtensionError') {
                res.json({
                    status: false,
                    msg: "File has invalid extension"
                });
            } else if (err == "Error: File too large") {
                res.json({
                    status: false,
                    msg: "File size exceed the limit,Allowed limit is 3 MB"
                })
            } else {
                console.log("err else section:" + err);
                res.json({
                    status: false,
                    msg: genericErrorMessage
                })
            }
        }else{
            console.log("Inside else of insert");
            let brandHeaderImg = req.body.brandHeaderImg;
            let brandLogoImg = req.body.brandLogoImg;
            let errorArray = [];
            let msg = null;
            //insert images into db
        }
    });
})

我没有明白我做错了什么,有人可以帮忙吗?我是 node.js 的新手,如果问题看起来很愚蠢,请原谅我。

【问题讨论】:

  • 您在底部回调中的任何代码是否曾经使用res 创建响应?
  • 是的,async.series()async.waterfall() 在路由处理程序中工作得很好(如果你正确使用它们)。如果我们能看到这个路由器处理程序的所有真实代码,我们可以提供更好的帮助。用很少的真实代码,我们所能做的就是猜测。这是我的第一个猜测。你在.post() 处理程序中调用next() 吗?如果是这样,那将在您的异步代码完成之前到达您的默认 404 处理程序。如果您自己发送响应并且不希望发生进一步的路由,请不要致电next()
  • @PatrickRoberts 请检查我刚刚所做的编辑
  • 这根本没有帮助。它仍然只是伪代码。您可以在您的async.series() 调用的完成回调中放置一个console.log(),以查看它是否到达那里。我们无法对此进行测试。
  • @jfriend00 不,我不会在 .post() 内调用 next

标签: node.js asynchronous post async.js


【解决方案1】:

异步库中的回调需要调用为:

callback(err, arg1, arg2, arg3);

首先是 err 参数,然后是其他可选参数。如果没有错误并且您希望继续处理,则传递 null 以获取错误:

callback(null, arg1, arg2, arg3);

仅供参考,Javascript 开发的趋势是“承诺”您拥有的任何异步操作(创建一个返回承诺而不是使用普通回调的包装器),然后使用承诺和 async/await 功能进行异步控制流和错误处理。我强烈建议以这种方式编写新代码,而不是使用带有传统回调的异步库。

node v10 甚至包括一个 promisified 版本的 fs 库,现在越来越多的节点内部使用 promises 和 async/await

【讨论】:

  • 我更改了调用异步库的方式,但问题仍然存在。我同意你关于承诺的趋势。但我想使用 async.series 或 async.waterfall 来实现它
猜你喜欢
  • 2012-03-04
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多