我正在开发一个可以找到here的Node.js + Express应用程序,我正在使用Sequelize进行数据库建模和抽象。我正处于需要我的路线做一些稍微复杂的事情的地方。我希望他们能够查询数据库中的不同表,并能够处理查询结果的不同偏移和限制。目前我的routes
文件夹结构如下所示:
.
├─routes
│ ├─api
│ │ ├─users.js
│ │ ├─index.js
│ ├─authenticationHelpers.js
│ ├─index.js
我编写了一个基本的authenticationHelpers.js
模块来充当验证每个请求的内容,如果请求中没有有效的会话数据,则返回json表示您未经过身份验证,或者在某些情况下将用户重定向到新观点。但是,我希望我的users.js
和将来的模块具有足够复杂的端点,以接收limit
或offset
查询参数,并返回数据库中的最后limit
个用户。我在users.js
模块中非常语义地输入了这个逻辑,它看起来像这样:
// /users
router.get('/', authenticationHelpers.isAuth, function(request, response) {
/**
* Get user count and then calculate our
* offset as the count - offset
*/
return models.User.count().then(function(count) {
var offset = request.query.offset || count;
/**
* Get the last 'offset' users
* in the database.
* TODO: Make this a cleaner implementation *temporary*
*/
models.User.findAll({
offset: count-offset
}).then(function(users) {
var returnUsers = [];
/**
* Prune users object for public display
* TODO: break this out to some sort of data logic utility
* function for seamless reusability
*/
users.forEach(function(user, i) {
user = {
"name": user.name.split(" ")[0],
"username": user.username,
"profile_picture": user.profile_picture,
"last_active": user.last_active
}
returnUsers.push(user);
});
response.json(returnUsers); // set response
}).catch(function(error) {
console.log(error);
response.json(error);
});
}).catch(function(error) {
});
});
我对此有几个问题:
我在点击此端点时收到警告,这是我在处理程序中创建承诺的行,但是从不返回承诺。这是完全有道理的,但是将一些逻辑推出到负责从模型中返回适当数据的业务逻辑层是一个更具激励性的因素。
我在这里有一些非常可重复使用的逻辑,例如将用户对象修剪为仅包含我希望公开显示的属性。我绝对不希望在每个路由实现中重写这些内容,而且我希望根据不同级别的数据容量来处理它。也许如果用户没有登录,他们只能看到2个公共用户属性,如果你是用户的朋友,你可以看到4个,如果你是用户,你可以看到7个,依此类推。这需要更复杂的身份验证和模型查询逻辑,为我提供了另一个激励因素,可以将这种逻辑从路径中推出。
我也希望很快将sockets.io集成到这个应用程序中,这样做我将使用一些中间件连接套接字来表达会话,这样我就可以根据他们的登录和查看状态将内容推送到客户端。这意味着我需要一些逻辑用于套接字,而不是在app.js
或www
模块中,我希望它们与我的紧密耦合Sequelize模型以及管理它们的业务逻辑。如果在每个路由实现中处理所有业务逻辑,这将不容易。
我想确保这个应用程序从一开始就结构良好,这样我就可以在不久的将来真正地构建它,而不会陷入困境。我正在寻找一些关于如何打破这个应用程序的业务和套接字逻辑的建议。
我正在考虑在routes
和models
旁边创建另一个目录,该目录名为Controllers
,Server Logic
,lib
或其中一个为了容纳这类东西,基本上构建业务逻辑和实用程序模块,以便我可以从我的所有路由中调用它们,并且它们会完成它们的工作并返回必要的信息。关于这样做的任何建议以及最合乎逻辑的地方都是我想要的。