1

我需要在我的控制器中验证多项检查并将可能的错误抛出到我的路由中。像这样的东西:

路由器:

  • 将 post var 发送到控制器

控制器:

  • 如果 post.categoria 为空,则抛出错误
  • 如果已经存在,请检查 mysql
  • 如果已经存在则抛出错误

路由器代码:

// POST new
router.post('/', function(req, res, next){
    // get post var
    var post   = {categoria: req.body.categoria};

    // validate
    controller.newCategoria(post).then(
        result => { 
            // return valid result, I'll implement it later
            res.json(result);
        },
        error => {
            // return error to frontend
            res.json(error);
        }
    );

});

控制器代码:

module.exports.newCategoria = async (post) => {
    // throw error if blank
    if (post.categoria.length == 0)
        throw "categoria is empty"; // portuguese

    db.query('SELECT COUNT(id) AS count FROM categoria WHERE ?', post, function(err, result) { 
        if (err)
            throw err;
        if (JSON.stringify(result[0].count) >= 1)
            throw new Error("already exists");
    });

    return "ok";
};

如果我发送现有的类别,我会得到: Rethrow non-MySQL errors

我试图使用一个承诺:

module.exports.newCategoria = async (post) => {
    // check if blank
    if (post.categoria.length == 0)
        throw "blank categoria";

    new Promise((resolve, reject) => {
        db.query('SELECT COUNT(id) AS count FROM categoria WHERE ?', post, function(err, result) { 
            if (err)
                return reject(err);
            if (JSON.stringify(result[0].count) >= 1)
                return reject(new Error("already exists"));
            return resolve(result);
        });
    }).then(
        resolve => {
            // ok.. deal with it
            console.log('ok');
            console.log(resolve);
        },
        error => {
            throw error;
        }
    ).catch((error) => {
        throw error;
    });

    return "ok";
};

我不知道如何把它扔回去死记硬背,我收到了这个错误:

UnhandledPromiseRejectionWarning:错误:已经存在

我是 NodeJS 的新手,我需要一个好的练习。谢谢。

4

1 回答 1

1

你需要像这样返回一个Promise

module.exports.newCategoria = async (post) => {
    return new Promise((resolve, reject) => {
        // throw error if blank
        if (post.categoria.length == 0)
            reject(new Error("categoria is empty")); // make sure you are throwing Errors or else node will chastise you

        db.query('SELECT COUNT(id) AS count FROM categoria WHERE ?', post, function(err, result) { 
            if (err)
                reject(err);
            else if (Number(result[0].count) >= 1) // compare ints to ints, not string to int
                reject(new Error("already exists"));
            else
                resolve(result)
        });
    })
};

如果你想做更多异步的东西,这是你可以重构的一种方法

const alreadyExists = x => x && x[0] && x[0].length > 1

const getCategoria = post => {
  return new Promise((resolve, reject) => {
    db.query(
      'SELECT COUNT(id) AS count FROM categoria WHERE ?',
      post,
      (err, result) => {
        if (err)
          reject(err)
        else if (alreadyExists(result))
          reject(new Error('already exists'))
        else
          resolve(result)
      },
    )
  })
}

module.exports.newCategoria = async post => {
  const categoria = await getCategoria(post)
  // insert here
}
于 2020-05-24T17:34:47.800 回答