СУХОЙ - Как сделать 2 функции GET, которые переводят разные таблицы в функцию 1 GET - PullRequest
0 голосов
/ 28 сентября 2018

В моем REST API у меня есть почти 2 почти идентичные функции.Как сделать так, чтобы 1 менялось в зависимости от того, что я передаю в URL?

app.delete('/tourists/:id', (req, res, next) => {
   pool.connect(function (err, client, done) {
       if (err) {
           console.log("Cannot connect to the DB" + err);
       }
       client.query('DELETE FROM tourists WHERE tourists.id=' + req.params.id, function (err, result) {
            done();
            if (err) {
                console.log(err);
                res.status(400).send(err);
            }
            client.query('SELECT * FROM tourists', function (err, result) {done();res.status(200).send(result.rows)});
       })
   })
});
app.delete('/flights/:id', (req, res, next) => {
   pool.connect(function (err, client, done) {
       if (err) {
           console.log("Cannot connect to the DB" + err);
       }
       client.query('DELETE FROM flights WHERE flights.id=' + req.params.id, function (err, result) {
            done();
            if (err) {
                console.log(err);
                res.status(400).send(err);
            }
            client.query('SELECT * FROM flights', function (err, result) {done();res.status(200).send(result.rows)});
       })
   })
});

Я пытался с

app.get('/:table/:id' , ...

// client.query('DELETE FROM ' + req.params.table + '...

И я пытался с

req.params.name

Но оба не правы

1 Ответ

0 голосов
/ 28 сентября 2018

Интересно, почему другой ответ был удален его автором - похоже, даже СУХОЙ !!

Не совсем то, что вы хотите, но это СУХОЙ

Создайте функцию

const mydeletefn = table => (req, res, next) => {
   pool.connect((err, client, done) => {
       if (err) {
           console.log("Cannot connect to the DB" + err);
       }
       client.query(`DELETE FROM ${table} WHERE ${table}.id=${req.params.id}`, (err, result) => {
            done();
            if (err) {
                console.log(err);
                res.status(400).send(err);
            }
            client.query(`SELECT * FROM ${table}`, (err, result) => {
                done();
                res.status(200).send(result.rows)
            });
       })
   })
};

, теперь используйте ее как

app.delete('/tourists/:id', mydeletefn('tourists'));
app.delete('/flights/:id', mydeletefn('flights'));

Еще один, возможно, более полезный параметр:

const mydeletefn = (table, col='id') => (req, res, next) => {
   pool.connect((err, client, done) => {
       if (err) {
           console.log("Cannot connect to the DB" + err);
       }
       client.query(`DELETE FROM ${table} WHERE ${table}.${col}=${req.params[col]}`, (err, result) => {
            done();
            if (err) {
                console.log(err);
                res.status(400).send(err);
            }
            client.query(`SELECT * FROM ${table}`, (err, result) => {
                done();
                res.status(200).send(result.rows)
            });
       })
   })
};

Разница в том, что вы можете указать, какой параметр/ column для использования в качестве индекса - это ... (по умолчанию это id)

например, если у вас есть таблица и вы хотите удалить ее по имени столбца 'userid' вместо 'id'

app.delete('/users/:userid', mydeletefn('users', 'userid'));

и наконец - я не знаю, почему @SimpleJ удалил свой ответ.комбинируя приведенный выше код с его

const deleteEndpoint = (table, col='id') => 
    app.delete(`/${table}/:${col}`, (req, res, next) => {
        pool.connect(function (err, client, done) {
            if (err) {
                console.log("Cannot connect to the DB" + err);
            }
            client.query(`DELETE FROM ${table} WHERE ${table}.${col}=${req.params[col]}`, (err, result) => {
                done();
                if (err) {
                    console.log(err);
                    res.status(400).send(err);
                }
                client.query(`SELECT * FROM ${table}`, (err, result) => {
                    done();
                    res.status(200).send(result.rows);
                });
            })
        })
    };

, тогда это простой случай

deleteEndpoint('tourists'); // col defaults to `id`
deleteEndpoint('flights'); // col defaults to `id`
deleteEndpoint('users', 'userid');
...