节点/ Express:使用异步等待的API

时间:2019-02-08 21:13:20

标签: node.js express mysql2

我是Node的新手,想知道我是否在API设计中使用 async / await 朝着正确的方向前进。

目前,这仅用于MVP项目,但我对学习良好的模式感兴趣。

堆栈:节点,Express,MySQL(使用mysql2包)

以下是端点的简化版本,应该使您了解我在做什么:

  createUser = async (req, res) => {
    const name = req.body.name;
    const email = req.body.email;

    let query = 'insert into Users set name = ?, email = ?';
    const values = [name, email];
    query = mysql.format(query, values);

    let result;

    // in the project, this is abstracted
    try {
      const [rows] = await this.dbPool.execute(query);
      // do something with the result of the query. simplified eg:
      result = rows.insertId;
    } catch (err) {
      // handle error and assign appropriate value to result
    }

    res.send(result);
  };

上面的代码可以完成我想做的事情,但是我想知道我是否在以 endpoint与db 交互的方式犯了一个菜鸟错误,将来会咬我。 (不知道我不知道的情况。)尽管如此,但我并不是在寻找通用的编码最佳实践(上面的代码已简化)。

2 个答案:

答案 0 :(得分:2)

最好将所有可能导致错误的代码放在try块中。

不需要result临时变量。 res.send(rows.insertId)可以直接放在try块中,因为中间件不会处理外部的任何错误,并且会导致请求被暂停:

  createUser = async (req, res) => {
    try {
    const name = req.body.name;
    const email = req.body.email;

    let query = 'insert into Users set name = ?, email = ?';
    const values = [name, email];
    query = mysql.format(query, values);

      const [rows] = await this.dbPool.execute(query);
      // do something with the result of the query. simplified eg:
      res.send(rows.insertId);
    } catch (err) {
      // handle error and assign appropriate value to result
    }
  };

在其他方面,它已经足够好了。

答案 1 :(得分:0)

在没有更多上下文和完整项目的情况下很难回答您的问题。就异步/等待而言,如果它能正常工作,那就很好了。

话虽如此,总有空间以不同的方式做事,这可以提高代码的灵活性和可重用性。

例如,添加验证,对快速应用程序进行分层,将应用程序逻辑与框架分离,等等。

如果您有兴趣,可以通过以下链接进行额外阅读:

https://github.com/i0natan/nodebestpractices

https://nodefunction.com/nodejs/node-js-roadmap-a-route-from-beginners-to-become-expert-developer