为什么我收到此错误 val.toString is not a function?

时间:2021-04-11 15:46:41

标签: sql node.js express

以下是我更新数据库字段的代码。即使没有提供所有字段,我也想更新字段。它也有一张图片。即使用户没有提供图片,我也想更新它。请帮我解决这个错误。

const updateBrand = async (req,res,next) => {
    var id = req.params.id;
    console.log(id)
    var db = req.con;
    const brand = {
        "brandName" : req.body.brandName,
        "sortOrder" : req.body.sortOrder,
        "status"  : req.body.status
    }
    // const updatedbrand = req.body;
    if(req.files !== undefined){
    const data = {
        "brandName": req.body.brandName,
        "sortOrder": req.body.sortOrder,
        "status": req.body.status,
        "brandImage": req.file.filename,
    }

    let result = await db.query("Update Brands set ? where BrandId=?",[data, id], function(err,rows){
        if(err){
            res.json({
                success:0,
                message:"An error occurred"
            })
        }
        else{
            res.json({
                success:1,
                message:"Updated" 
            })
        }
    })
    }
    if(req.files == undefined){
        console.log("inside res")
        console.log(brand)
        let result = db.query("Update brands set ? where brandId=?",[res,id],function(err,rows){
            if(err){
                res.json({
                    success:0,
                    message:"An error occurred"
                })
            }
            else{
                res.json({
                    success:1,
                    message:"Updated" 
                })
            }
                })
        }
    }

我收到了这个回复 -

Server start on port : 8080
Connection established
15741804
inside res
{ brandName: 'sketcher', sortOrder: '5', status: 'Active' }
(node:10952) UnhandledPromiseRejectionWarning: TypeError: val.toString is not a function
    at Object.escape (E:\coding backup\Brands\node_modules\sqlstring\lib\SqlString.js:52:33)
    at Object.objectToValues (E:\coding backup\Brands\node_modules\sqlstring\lib\SqlString.js:180:89)
    at Object.escape (E:\coding backup\Brands\node_modules\sqlstring\lib\SqlString.js:54:26)
    at Object.format (E:\coding backup\Brands\node_modules\sqlstring\lib\SqlString.js:100:19)
    at Connection.format (E:\coding backup\Brands\node_modules\mysql\lib\Connection.js:271:20)
    at Connection.query (E:\coding backup\Brands\node_modules\mysql\lib\Connection.js:189:22)
    at updateBrand (E:\coding backup\Brands\src\Controller\controller.js:204:25)
    at Layer.handle [as handle_request] (E:\coding backup\Brands\node_modules\express\lib\router\layer.js:95:5)
   

2 个答案:

答案 0 :(得分:0)

可能您打算将“品牌”或“数据”传递给 db.query() 而不是 res。所以试试“[brand, id]”或“[data, id]”。

我认为你在第二个数组中传递的参数应该有一个 toString() 方法。这是因为它们需要嵌入到 sql 字符串中。我使用错误的堆栈跟踪提出了这个想法。 sqlstring 库正在尝试对参数进行转义(例如防止 sql 注入),如果参数不是字符串,它必须在参数上调用 toString()。

答案 1 :(得分:0)

您正在等待非异步方法,因为您使用的是回调。只需从代码中删除 await 关键字:

let result = db.query("Update Brands set ? where BrandId=?",[data, id], function(err,rows){...});

如果您想使用 await 关键字,请按如下方式更新您的代码:

try {
    let result = await db.query("Update Brands set ? where BrandId=?",[data, id]);
} catch (exception) {
    console.log("An error happened!" + exception);
}

正如@srknzl 提到的,确保您的额外参数 [data, id] 可以转换为字符串。