Node JS 中的架构 wirh 控制器、服务和存储库
Architecture in Node JS wirh Controller, Service and Repository
为了保持我的 node.js 架构整洁,我有控制器、服务和存储库。
数据流:控制器 -> 服务 -> 存储库 -> 服务 -> 控制器。
在此流程中(在简单的用户故事中)存储库 returns 数据到服务和服务到控制器。但是存储库应该处理对外部存储的请求。
现在我遇到了回调困难,如何在控制器和存储库之间实现嵌套回调?
我的控制器:
exports.clientes_get = async function (req, res) {
Cliente.find(function(err,params) {
if (err)
res.send(err);
res.json(params);
});
}
我的服务:
ClienteGet(req) {
var response;
repo.get(req.params.clienteId, (err, res) => {
response = res;
//console.log(response); -> have data
});
//console.log(response); -> doesnt have data
return response;
};
我的存储库:
get(clienteId, data) {
mongoose.model('Cliente').findById(clienteId, data);
};
我该怎么做?
使用回调
如果你坚持使用回调:
控制器:
// notice that the `async` here was not necessary
exports.clientes_get = function (req, res) {
// the `function(err, params) {...}` here is your callback
ClienteGet(req, function(err, params) {
if (err) {
return res.send(err);
}
res.json(params);
});
}
服务:
ClienteGet(req, callback) {
// simply pass the callback argument directly to the `repo.get` call
repo.get(req.params.clienteId, callback);
};
存储库:
get(clienteId, callback) {
// again, just pass the callback here
mongoose.model('Cliente').findById(clienteId, callback);
};
使用承诺
我个人建议将您的代码包装在
Promises,
因为它们比回调更灵活,现代 JavaScript 使用
许诺重重。这几乎是新标准......事实上, async
/
await
语法在幕后利用 Promises。
下面是如何使用 Promises 的粗略描述:
控制器:
exports.clientes_get = function (req, res) {
return ClienteGet(req)
.then((data) => {
res.json(data);
})
.catch((err) => {
res.send(err);
});
}
服务:
ClienteGet(req) {
return new Promise((resolve, reject) => {
repo.get(req.params.clienteId, (err, res) => {
if (err) {
return reject(err);
}
resolve(res);
//console.log(response); -> have data
});
});
};
存储库:
get(clienteId) {
return new Promise((resolve, reject) => {
mongoose.model('Cliente').findById(clienteId, function(err, document) {
if (err) {
return reject(err);
}
resolve(document);
});
});
};
为了保持我的 node.js 架构整洁,我有控制器、服务和存储库。
数据流:控制器 -> 服务 -> 存储库 -> 服务 -> 控制器。 在此流程中(在简单的用户故事中)存储库 returns 数据到服务和服务到控制器。但是存储库应该处理对外部存储的请求。
现在我遇到了回调困难,如何在控制器和存储库之间实现嵌套回调?
我的控制器:
exports.clientes_get = async function (req, res) {
Cliente.find(function(err,params) {
if (err)
res.send(err);
res.json(params);
});
}
我的服务:
ClienteGet(req) {
var response;
repo.get(req.params.clienteId, (err, res) => {
response = res;
//console.log(response); -> have data
});
//console.log(response); -> doesnt have data
return response;
};
我的存储库:
get(clienteId, data) {
mongoose.model('Cliente').findById(clienteId, data);
};
我该怎么做?
使用回调
如果你坚持使用回调:
控制器:
// notice that the `async` here was not necessary
exports.clientes_get = function (req, res) {
// the `function(err, params) {...}` here is your callback
ClienteGet(req, function(err, params) {
if (err) {
return res.send(err);
}
res.json(params);
});
}
服务:
ClienteGet(req, callback) {
// simply pass the callback argument directly to the `repo.get` call
repo.get(req.params.clienteId, callback);
};
存储库:
get(clienteId, callback) {
// again, just pass the callback here
mongoose.model('Cliente').findById(clienteId, callback);
};
使用承诺
我个人建议将您的代码包装在
Promises,
因为它们比回调更灵活,现代 JavaScript 使用
许诺重重。这几乎是新标准......事实上, async
/
await
语法在幕后利用 Promises。
下面是如何使用 Promises 的粗略描述:
控制器:
exports.clientes_get = function (req, res) {
return ClienteGet(req)
.then((data) => {
res.json(data);
})
.catch((err) => {
res.send(err);
});
}
服务:
ClienteGet(req) {
return new Promise((resolve, reject) => {
repo.get(req.params.clienteId, (err, res) => {
if (err) {
return reject(err);
}
resolve(res);
//console.log(response); -> have data
});
});
};
存储库:
get(clienteId) {
return new Promise((resolve, reject) => {
mongoose.model('Cliente').findById(clienteId, function(err, document) {
if (err) {
return reject(err);
}
resolve(document);
});
});
};