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
}
};
其他方面已经足够好了
我是节点的新手,想知道我在 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
}
};
其他方面已经足够好了