首页 > 解决方案 > Expressjs MVC 在路由器中无法让 listAll() 从猫鼬返回数据

问题描述

我正在尝试为一个非常具体的用例实现 MVC(ish) 架构到 expressjs 中。我想我有一个承诺问题,但我仍然无法在这里正确调试问题。

关于架构:路由器调用将触发实际上是服务层中类的方法的函数。例如:router.get('/users/list') -triggers-> userService.listAll() -returns array of users->res.render('apage',{users:users}); (用户是一个包含返回值的变量)..

虽然 userService 能够访问数据源并返回数据,但路由器内部的“users”变量不会受到任何影响。

实际代码是:users.js

router.get('/dashboard',  function(req, res) {
    var users= userService.listAll();
    res.render('dashboard.twig', {users: users});
});

用户服务.js

async listAll(){

        await utilisateurModel.find({}).then(
            function(data){
            console.log("data is:"+JSON.stringify(data));
            return data;

     });
    }

知道如何解决这个问题吗?

标签: javascriptexpressmodel-view-controllerpromise

解决方案


你对 Promise 和async/await.

listAll是一个异步函数,你必须使用await关键字来“获取”值。

用户服务.js

async listAll() {
  const data = await utilisateurModel.find({});
  console.log("data is:" + JSON.stringify(data));
  return data;
}

用户.js

router.get('/dashboard', async function (req, res) { // async function
  var users = await userService.listAll(); // await keyword
  res.render('dashboard.twig', { users: users });
});

推荐阅读