Экспресс JS с MySQL обновления только поля, которые передаются - PullRequest
0 голосов
/ 06 октября 2018

Я пытался настроить API отдыха в течение нескольких дней.Я следовал замечательному учебнику, который действительно помог мне понять большую часть того, как они работают (отправка запросов, получение ответов и т. Д.).Однако он использует MongoDB и Mongoose.Я использую MySQL.Мои таблицы и представления немного сложны, поэтому я решил вместо использования ORM просто использовать пакет mysql2 и выполнять запросы самостоятельно.Я застрял с попытками PATCH и PUT в данный момент.Часть моего внешнего интерфейса иногда отправляет только 1 или 2 поля, которые необходимо обновить (PATCH из всего, что я собрал).Поэтому я использовал часть учебника MongoDB и Mongoose, чтобы построить массив объектов и передать их в connection.query.Вот мой маршрут исправления:

router.patch('/:txnid', (req, res, next) => { //UPDATE fields that are passed
    const txnid = req.params.txnid;

     for (const field of req.body) {
         fieldsToUpdate[field.name] = field.value;
     }

    connection.query("UPDATE QuoteToClose SET ? WHERE qb_TxnID = '" + txnid + "'", { fieldsToUpdate }, function (error, results) {
        if (error) {
            res.status(404).json({
                message: error,
                field: fieldsToUpdate
            });
        } else {
            res.status(201).json({
                "record_count" : results.length,
                "error": null,
                "response": results
            });
        }
    });
});

Иногда я пропускаю 1 поле, иногда пропускаю 2. В этом случае я пропускаю только 1. Я строю свое тело в POSTMAN и отправляю это с запросом PATCH:

[
    {
    "name": "margin",
    "value": "50"
    }
]

Когда я запускаю это через POSTMAN, я получаю ошибку:

{
    "message": {
        "code": "ER_BAD_FIELD_ERROR",
        "errno": 1054,
        "sqlState": "42S22",
        "sqlMessage": "Unknown column 'fieldsToUpdate' in 'field list'"
    },
    "field": {
        "margin": "50"
    }
}

Хотя я не уверен, почему.К сожалению, я не использую Mongoose, поэтому не знаю, зависит ли что-то от этого, что я пропускаю.Мой анализатор тела настроен так:

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

Я хочу динамически построить этот запрос, а не указывать каждое поле (этот способ выглядит чище.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Привет, я использую эту библиотеку для создания динамических запросов. https://www.npmjs.com/package/flexqp

let result = await qp.executeUpdatePromise('update user set ?  where user.id = ?', [user, user.id], dbconfig);

Пользователь - это объект с большим количеством подэлементов, библиотека автоматически заполнит запрос

для обновления Egимя пользовательского набора = 'xxx', адрес = 'xxx' .. и т. д., где user.id = 1

0 голосов
/ 06 октября 2018

fieldsToUpdate уже является объектом.Если вы удаляете curlies при параметризации, если вам нужно идти вперед:

connection.query("UPDATE QuoteToClose SET ? WHERE qb_TxnID = '" + txnid + "'", fieldsToUpdate,

Кроме того, в качестве дополнительного примечания, что конкатенация строк - плохая идея, вы просто просите атаку SQL Injection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...