【发布时间】:2022-01-04 01:23:39
【问题描述】:
我是一名 Node.js 学生,正在编写一个简短的示例。 /org 上的获取按预期工作。
在 /orgg 上,我尝试将服务器“获取数据”逻辑与控制器隔离开来。但是,getRowsAsync() 会立即返回一个 Promise。
这种“将 await 放入 express.get()”不利于隐藏逻辑。如果我的 biz 逻辑需要一些顺序的 Promise,那么 biz 逻辑就必须冒泡到控制器中。
如何在控制器中调用“doBizLogic()”,隐藏我的等待,让控制器等待逻辑完成? 必须我将回调函数传递给 biz 逻辑以使该方案有效吗?
这是我的 index.js。我省略了database.js,但我从https://mhagemann.medium.com/create-a-mysql-database-middleware-with-node-js-8-and-async-await-6984a09d49f4借来的
const express = require("express");
const urlPort = 3000;
let app = express();
let mysql = require("mysql2");
let pool = require("./database");
app.listen(urlPort, () => {
console.log("Server is running at port " + urlPort);
});
app.get("/", (req, res) => {
res.send("This app responds to /org and /org/:id only.");
});
app.get("/org", async (req, res) => {
let rows = await getRows("select * from org");
// the log always prints a JSON array.
console.log("in app.get for /org, rows: ", rows);
res.send(rows);
});
app.get("/orgg", (req, res) => {
let rows = getRowsAsync();
// the log() prints immediately prints a Promise.
console.log("in app.get for /orgg, rows: ", rows);
res.send(rows);
});
function getRows(sql, params = []) {
let rows = pool.query(sql, params);
// the log() prints a Promise.
console.log("in getRows, rows: ", rows); // returns
return rows;
}
async function getRowsAsync() {
let rows = await getRows("select * from org");
// the log() prints a JSON array, once it is finally called.
console.log("in getRowsAsync, rows: ", rows);
return rows;
}
【问题讨论】:
-
你需要
let rows = await getRowsAsync() -
你的函数是同步的还是异步的不是你应该隐藏的“业务逻辑”。它只是函数定义的一部分,与它的参数或返回值没有什么不同。调用者需要知道函数是否是异步的,就像它需要知道要传递多少个参数一样。
-
好的,我可以接受 this 解决方案。我将“fcn”标记为 app.get("/orgg, async fcn),并在 getRowsAsync() 上等待。然后我可以将任意数量的 async/await 组合埋入任意深度,例如在 getRowsAsync1 中,调用... getRowsAsyncN,DB终于可以工作了。有更好的解决方案吗?
标签: javascript node.js express async-await