Jam*_*ett 5 javascript rest node.js express
我有一些 PHP 和前端 JavaScript 经验,但我正在尝试制作一个 Node.js REST API 来为我的一个应用程序的 Vue.js 客户端提供服务,但是我正在努力解决某个概念。到目前为止,我主要关注在线文档和指南。
我正在使用 Express.js 和 MySQL 数据库。
在这个例子中,我有一个定义客户本身的客户模型,以及与数据库交互的方法。
// constructor
const Customer = function(customer) {
this.email = customer.email;
this.name = customer.name;
this.active = customer.active;
this.created_at = customer.created_at
};
Customer.getAll = result => {
sql.query("SELECT * FROM customers", (err, res) => {
if (err) {
console.log("error: ", err);
result(null, err);
return;
}
console.log("customers: ", res);
result(null, res);
});
};
...
Run Code Online (Sandbox Code Playgroud)
然后我有一个客户控制器,它控制被调用的方法并在将其检索到前端之前进行任何操作。
const Customer = require("../models/customer.model.js");
exports.findAll = (req, res) => {
Customer.getAll((err, data) => {
if (err)
res.status(500).send({
message:
err.message || "Some error occurred while retrieving customers."
});
else res.send(data);
});
};
...
Run Code Online (Sandbox Code Playgroud)
此设置适用于基本的 CRUD 操作,但如果我想撤回一组特定的用户并执行操作而不是整个组,该怎么办。
例如,我想检索过去 3 个月每月创建的客户数量列表:
11/2019 200
12/2019 234
01/2020 122
Run Code Online (Sandbox Code Playgroud)
我应该向我的模型添加一个新方法,以所需格式返回数据,还是应该向控制器添加一个新方法,该方法利用 getAll 方法并根据提供的参数对其进行过滤?我认为如果我对查询有很多特定要求,向模型添加新方法可能很快就会失控,但是如果我过滤掉控制器中的全套数据,这似乎效率低下,因为我正在检索所有最初来自数据库的数据,当我将忽略其中的大部分时。
可能我完全不合时宜,这两种方法都是不正确的。
这是为了提供额外的清晰度。
我可以通过将以下代码添加到我的模型和路由中来实现所需的输出:
Customer.getCreatedByMonth = result => {
sql.query("select DATE_FORMAT(created_at, '%m/%Y') as month, count(*) as count from customers group by DATE_FORMAT(created_at, '%m/%Y')", (err, res) => {
if (err) {
console.log("error: ", err);
result(null, err);
return;
}
console.log(res);
result(null, res);
});
};
app.get("/customers/monthly", customers.findCreatedByMonth);
Run Code Online (Sandbox Code Playgroud)
但这并不是一种非常干净的方法,而且我觉得我通过添加新路由及其命名/访问方式打破了一些 CRUD 约定。
我知道 SQL,理想情况下我想避免 ORM,因为我仍在学习 Node.js。
我相信这实际上取决于 API 的使用者,而不是 NodeJS 特有的问题。
您在 处有一个资源/customers,对于基本的 CRUD,您可能有GET, PUT, POST,DELETE方法。
粗略地浏览一下以这种方式设计的 RESTful API 时,我会假设GET端点处的a/customers会返回一个客户列表或数组。
在创建 的路径时/customers/monthly,您试图描述听起来类似于过滤器的附加功能。每月听起来像是试图返回经过筛选或按月份分组的客户列表。
评论中的其他人似乎暗示这可能可以使用查询字符串参数来解决。您不是添加额外的路径/customers,而是提供类似的东西/customers?groupBy=month。
听起来您想避免增加模型的复杂性,但我认为当您超出基本 CRUD 操作时这是不可避免的。您需要有某种方法将 HTTP 请求转换为 SQL 操作。
另一个问题是,模型或控制器是否应该负责获取适当的数据?该模型距离数据最近,因此它可能应该负责。
根据数据集的大小,获取所有记录并在控制器级别进行过滤可能变得不切实际。控制器实际上应该负责转换客户端对模型的请求,以便可以检索适当的数据,然后确保检索的数据经过格式化,以便客户端可以接收它。
| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |