Node/Express:API 使用异步等待

Node/Express: API using async await

我是节点的新手,想知道我在 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 交互的方式上犯了一个菜鸟错误,那会咬我的在将来。 (不知道我还不知道什么的情况。)尽管欢迎他们,但我不是在寻找一般的编码最佳实践(上面的代码已简化)。

如果不了解更多上下文和查看完整项目,很难回答您的问题。就 async/await 而言,如果它能正常工作,那就没问题。

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

例如,添加验证、分层您的 Express 应用程序、将您的应用程序逻辑与框架分离等。

如果您有兴趣,这里有一些额外阅读的链接:

https://github.com/i0natan/nodebestpractices

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

最好将所有可能导致错误的代码放在 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
    }
  };

其他方面已经足够好了