Express js与mysql仅更新通过的字段

时间:2018-10-05 21:40:26

标签: javascript node.js express

几天来我一直在尝试设置rest API。我一直在关注一个出色的教程,该教程确实帮助我了解了这些工作原理的很大一部分(发送请求,获取响应等)。但是,它使用MongoDB和Mongoose。我正在使用MySQL。我的表和视图有点复杂,所以我决定不使用ORM,而是使用mysql2程​​序包自己进行查询。目前,我坚持尝试PATCHPUT。我前端的一部分功能是有时仅发送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 :(得分:1)

您好,我正在使用此库来构建动态查询。https://www.npmjs.com/package/flexqp

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

用户是一个包含许多子元素的对象,该库将自动填充

查询到例如更新用户集名称='xxx',地址='xxx'..etc,其中user.id = 1

答案 1 :(得分:0)

fieldsToUpdate已经是一个对象。如果您在参数化时移除了冰壶,那么是否应该行得通:

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

此外,作为一个侧面说明,字符串连接不是一个好主意,您只是在请求SQL注入攻击。