Приложение My Node.js предоставляет как WebSockets, так и RESTful. Я написал небольшую замену для Backbone.synch
для использования с Socket.IO в качестве транспорта.Интерфейс WebSockets plus RESTful, как написать DRY-код в Node.js?
DRY problem: обратные вызовы, выполненные по клиенту, содержат почти ту же логику, что и обратные вызовы для путей RESTul. Пример отображения между событиями и данными, испускаемых клиентом, и соответствующее действие:
+----------------+---------------------------------+--------------------+
| event emitted | data emitted | RESTful URL |
+----------------+---------------------------------+--------------------+
| read:users | empty string | GET /users |
| read:users | id of the model | GET /users/:id |
| create:users | full model as JSON | POST /users |
| destroy:users | id of the model | DELETE /users/:id |
| update:users | full model as JSON (with id) | PUT /users/:id |
| patch:users | partial model as JSON (with id) | PUT /users/:id |
+----------------+---------------------------------+--------------------+
Пример (99% дублированного логики/код):
var UserModel = require('./models/user'); // Mongoose model
// Express path
app.get('/users/:id?', function (req, res)) {
var query = !id ? {} : { _id: id };
UserModel.find(query, function (err, doc) {
return err ? res.send(404, null) : res.send(200, doc);
});
};
// SocketIO listening to the read:users event
socket.on('read:users', function(id, cb) {
var query = !id ? {} : { _id: id }
UserModel.find(query, function (err, doc) {
return err ? cb(err.message, null) : cb(null, doc);
});
});
Потому что я играл с узлом. JS и программирование событий (и JavaScript) в течение нескольких дней, я ищу хороший совет о том, как дизайн «контроллер», как объект общего назначения, который может легко обрабатывать дублированный код. Благодарю.
Хотя я ценю ваши усилия, я должен сказать, что я не согласен с вашим ответом. Я знаю, какие модули есть, но ваше решение просто перемещает оба обратных вызова в отдельный модуль. Что-то делать наверняка, но мой вопрос касался логики их объединения (с проблемами, связанными с параметрами). В любом случае спасибо! – Polmonino
Я обновил свой ответ, чтобы продемонстрировать, что с вашей текущей настройкой не существует способа обойти проблему дублирования логики. Однако, если вы скорректировали свой клиентский код, который испускает событие сокета для передачи объекту со схожими функциями/свойствами к тому, что получено в вызове app.get() (объекты Request and Response), вы можете уменьшить повторение кода. Однако, по моему личному мнению, я считаю, что это плохая практика, так как вы действительно ограничиваете то, что можете сделать с этой функцией (без добавления более сложного кода, видимого для вашей информации на стороне клиента). – Default