将 Express Router 与 Massive.js 数据库调用结合使用时出错

Error when combining Express Router with Massive.js db call

当通过 massive.js 实例从 Express 路由器对数据库进行 async/await 调用到 postgres 数据库时,收到了来自数据库的正确响应,但路由器显然 returns 在异步之前功能完成;因此,测试调用 returns 未定义。从控制台输出(下方),似乎很明显异步函数没有等待 >_<

是否包装路由器以传递引起问题的应用程序实例?

app.js

const app = express();
const massiveInstance = require("./db_connect");
const routes = require("./routes");

const PORT = 3001;
const server = massiveInstance.then(db => {
  // Add db into our app object
  app.set("db", db);

  app.use("/api", routes(app));

  app.listen(PORT, () => {
    console.log("Server listening on " + PORT);
  });
});

routes.js

const router = require("express").Router();
const { countRegions } = require("./db_queries");

const routes = app => {
  const db = app.get("db");

  router.get("/regions/count", async (request, response) => {
    try {
      const total = await countRegions(db);
      console.log(`There are ${total} regions.`);
      response.send(`There are ${total} regions.`);
    } catch (err) {
      console.error(err);
    }
  });

  return router;
};

module.exports = routes;

db_queries.js

const countRegions = db => {
  db.regions.count().then(total => {
    console.log(`db has ${total} count for regions`);
    return total;
  });
};

module.exports = {
  countRegions,
};

控制台输出 Server listening on 3001 There are undefined regions. db has 15 count for regions

您没有在 countRegions 方法中返回 then 返回的承诺。 所以你应该像这样在你的代码中添加 return

const countRegions = db => {
  //here
  return db.regions.count().then(total => {
    console.log(`db has ${total} count for regions`);
    return total;
  });
};

或者干脆做,

return db.regions.count();