使用Node.js,Async和Formidable进行错误处理

Rob*_*boy 14 javascript node.js formidable async.js

在下面的代码片段中,我想验证第一个异步方法中的字段.

如果它们无效,我想立即向用户返回错误.

我怎么做?

var form = new formidable.IncomingForm();

async1.series([
    function (callback) {
        form.parse(req);

        form.on('field', function (name, val) {
            // Get the fields
        });

        form.on('fileBegin', function (name, file) {
            if (file.name !== "") {
                file.path = __dirname + '/upload/' + file.name;
            }
        });
        callback();
    },
    function (callback) {
        form.on('file', function (name, file) {
            try {
                // Do something with the file using the fields retrieved from first async method
            }
            catch (err) {
                logger.info(err);
            }
        });


        callback();
    }
], function (err) {
    //the upload failed, there is nothing we can do, send a 500

    if (err === "uploadFailed") {
        return res.send(500);
    }

    if (err) {
        throw err;
    }
    return res.status(200);

});
Run Code Online (Sandbox Code Playgroud)

Jon*_*lms 7

我会将表单检查提取到一个函数中:

var form = new formidable.IncomingForm();

function check(name, cb, err) {
 return new Promise((res,rej) => {
  form.on('field', function(n, val) {
        if(n !== name) return;
        if(cb(val)){
          res(val);
        }else{
          rej(err);
       }
   });
 });
}

form.parse(req);
Run Code Online (Sandbox Code Playgroud)

所以现在我们可以实现检查并使用Promise.all来总结它们:

 Promise.all(
   check("username", val => val.length > 4, "username isnt valid"),
   check("password", val => true, "we need a password")
 ).then(_ => res.json({status:200}))
  .catch(err => res.json({err}));
Run Code Online (Sandbox Code Playgroud)

如果并非所有参数都已通过,则会无休止地等待.因此,如果结束则终止:

const ended = new Promise((_,rej) => form.on("end", () => rej("params required"));

Promise.race(
 ended,
  Promise.all(
   check("username", val => val.length > 4, "username isnt valid"),
   check("password", val => true, "we need a password")
  )
).then(_ => res.json({status:200}))
 .catch(err => res.json({err}));
Run Code Online (Sandbox Code Playgroud)

因此,我们可以创建良好的数据流.例如:

const login = Promise.all(
  //usable as one liners
 check("username", val => val.length >= 8, "username invalid"),
 //or more extensible
 check("password", val => {
   if( val.length < 8 ) return false;
   //other checks
   console.log(password);
   return true;
 }, "password invalid")
//the field values are resolved by the promises so we can summarize them below 
).then(([username,password]) =>
   //a random (maybe async) call to evaluate the credentials
  checkAgainstDB(username,password)
  //we can directly fail here, err is  "password invalid" or "username invalid"
).catch(err => res.json({error:"login failed",details:err}));

 //another parameter can be extra handled    
const data = check("something", val => val.length);

//we need to summarize all the possible paths (login /data in this case) to one that generates the result
Promise.race(
 //here we join them together
 Promise.all(login, data)
   .then((l, d) => res.json(whatever),
 //and we use the ended promise ( from above ) to end the whole thing
 ended
  //and at last the errors that can occur if the response ended or that have not been canceled early
).catch(e => res.json(e));
Run Code Online (Sandbox Code Playgroud)


Dre*_*Cap 1

我假设这是一个验证的好地方,因为这是字段进入的时间:

form.on('field', function (name, val) {
    //if values are null
    if (!name || !val) {
        //pass the callback an error 
        return callback("Values are null")
    }
    // Get the fields
});
Run Code Online (Sandbox Code Playgroud)

请让我知道这可不可以帮你。