Как в Express работает маршрутизация?

Помогите разобраться с маршрутизацией в Node.js фреймворке Express.
Пишу приложение - менеджер заметок и на данный для всех CRUD-операций заметок имеются свои роутинги.
app.get('/notes', (req, res)=> {
    db.listNotes().then(data => res.send(data));
});

app.post('/notes', (req, res)=> {
    db.createNote(req.body).then(data => res.send(data));
});

app.delete('/notes/:id', (req, res)=> {
    db.deleteNote(req.params.id).then(data => res.send(data));
});

app.put('notes/:id', (req, res)=> {
   db.updateNote(req.params.id).then(data => res.send(data));
});


Это 4 функции работы с заметками. А если мне нужно будет добавить сущность "Пользователи", а затем "Темы", мне что, надо будет еще по 4 функции добавлять для каждой модели? Есть ли какие-то методы оптимизации такого рода задач? Или же главная точка входа в приложение так и должна хранить в себе такие однообразные функции?
  • Вопрос задан
  • 870 просмотров
Пригласить эксперта
Ответы на вопрос 4
@emp1re
однообразные функции?

У вас все функции разные, вынесите свою локигу в NotesController.
И не забывайте что это учебный пример и такой cb будет подлиннее 1 строки.
Посоветую глянуть что такое middleware и как error обрабатывать в express, вот это сразу режет глаз
Ответ написан
Комментировать
Вы ведь можете вынести это в отдельную функцию, и делать что-то вроде:

function crud(app, path, controller) {
    app.get(path, controller.get);
    app.post(path, controller.post);
    app.delete(`${path}/:id`, controller.delete);
    app.put(`${path}/:id`, controller.put);    
}

class NotesController {
    get(req, res) {
        db.listNotes().then(data => res.send(data));
    }

    post(req, res) {
        db.createNote(req.body).then(data => res.send(data));
    }

    delete(req, res) {
        db.deleteNote(req.params.id).then(data => res.send(data));
    }

    put(req, res) {
        db.updateNote(req.params.id).then(data => res.send(data));
    }
}

crud(app, '/notes', new NotesController);
crud(app, '/users', new UsersController);
Ответ написан
Комментировать
@nirvimel
Бескомпромиссное следование принципу DRY:
[
    ['get', '/notes', 'listNotes'],
    ['post', '/notes', 'createNote'],
    ['delete', '/notes/:id', 'deleteNote'],
    ['put', '/notes/:id', 'updateNote'],
].map(([app_method, route, db_method]) => {
    app[app_method](route, (req, res) => {
        db[db_method](req.params.id).then(data => res.send(data));
    });
});
Ответ написан
Fragster
@Fragster
помогло? отметь решением!
В качестве маршрута можно использовать регулярные выражения. Есть обработчик .any() в котором можно выцепить из req конкретный тип запроса (get/post/delete/put). Ну и есть app.route(), который может объединять обработчики в одну цепочку (в комбинации с регулярными выражениями). app.route().get().post().put().delete()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы