【问题标题】:Express (sequelize) export async functionExpress(续集)导出异步功能
【发布时间】:2018-10-27 08:37:38
【问题描述】:

一般来说,我对表达/NodeJS 很陌生。我开始编写一个小应用程序,提供一个 REST API。整个事情应该是这样的:

  • 请求被路由 (routes.js)
  • 在 routes.js 中,控制器中的函数被调用
  • 由于我的控制器包含应用程序的逻辑,它应该返回通过 res.json(CONTROLLER_FUNCTION()) 发送的数据。

我的代码:

controller.js

User = require('../models/user')

module.exports.users = function users() {
    users = User.findAll().then(users => {
    return users;
});

}

routes.js

/* GET users listing. */
router.get('/', function (req, res, next) {
  res.json(userController.users())
});

所以当我的路由被调用时,什么也没有发生。我相信这是因为我的控制器逻辑是异步的。可能我必须实现类似包装器/回调函数(?)

所以基本上我的问题是:处理这种情况的“正确”方法是什么?我的代码应该是什么样子的?

示例: 我通常会做的是向 userController.users 传递一个函数,该函数在异步操作完成时被调用 (.then)。

routes.js

/* GET users listing. */
router.get('/', function (req, res, next) {
  userController.users((data) => res.json(data));
});

controller.js

User = require('../models/user')

module.exports.users = function users(send) {
    users = User.findAll().then(users => {
        send(users);
    });
}

这是最好的方法吗? / 这被认为是好的做法吗?是否甚至建议不要将我的代码直接放入 routes.js 中?

【问题讨论】:

  • 从技术上讲,您的示例是正确的。另一方面,您必须全面了解您正在使用的库,并坚持共同点。例如,在这种特定情况下,我不会将回调传递给userController.users。我会简单地返回承诺,因为它是从User.findAll() 返回的。因为,如果大多数库都是基于 Promise 的,您可以链接它们、组合它们等等。并且只在最后调用 res.json(),在路由中。这仅用于说明目的。每个人都选择自己认为合适的最佳实践。您还可以查看 promisify 之类的库。
  • @muradm 感谢您的意见!我还考虑过在我的控制器中使用 Promise 和 jsut 返回 User.findAll(),然后在我的 routes.js 中调用 userCcontroller.users().then...。唯一让我思考这是否是一个好的解决方案是,这种方法也让我可以将我的逻辑写入我的控制器。你认为不管这种方法更好吗?
  • 这一切都取决于您的应用程序。在你的位置上,我不会坚持what if 控制器这个或逻辑那个,因为当你事先这样做时,你很可能会陷入过度设计的陷阱。去做吧,开始做你的应用程序,画 5-10 种方法,让它工作。然后修改。然后做接下来的5-10,然后修改所有,依此类推。一段时间后,您将拥有直觉和最佳实践 :) 最佳实践伴随着实践 :)

标签: javascript function express asynchronous sequelize.js


【解决方案1】:
module.exports.getUsers = async () => {
   const users = await User.findAll();

   return users; 
}

【讨论】:

  • 嗯,对不起,但这对我不起作用。我试过了,但总是得到一个空对象 {}。
  • @AGuyAskingQuestions 当然不是,答案混淆了异步/等待和承诺(整个 .then 块是多余的)。 module.exports.getUsers = async () => { const users = await User.findAll();返回用户; } 应该与你的 routes.js 中的 userController.getUsers().then(res.json) 一起使用。此外,您真的不应该使用与您的函数相同的名称来定义您的数组,请考虑使用 eslint 和代码编辑器的 eslint 扩展来避免此类事情并更容易遵循最佳实践。跨度>
  • 我已经根据asyncawait 语法更新了我的答案。
  • @Asifvora 对,但是 routes.js 中的处理程序仍然不知道它正在获取异步函数,因此也需要将其更改为 (req, res) => userController.getUsers( ).then(res.json) 或 async (req, res) => { const users = await userController.getUsers();返回 res.json(用户) }
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2017-03-19
  • 1970-01-01
  • 2022-12-01
  • 2014-02-15
  • 1970-01-01
相关资源
最近更新 更多