【发布时间】: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