首页 > 解决方案 > 如何使用节点 js 在 sql db 上插入记录?

问题描述

我的 node.js 服务器上有一个 post 路由,我想在 body 请求上发送一个 json 对象以将其插入到 sql 数据库中。

如果我使用"INSERT INTO users(UserInfo, BitMask) Values ("value1", 1)" 它可以工作,但如果我尝试像下面的示例中那样对对象进行 scape 则不会。

我也试过"INSERT INTO users(UserInfo, BitMask) Values ?", [client], ,但它不起作用。

  router.post("/add/client", (request, res) => {
     let client = {}
     client.UserInfo = request.body.name;
     client.BitMask = request.body.bitmask;

     pool.request().query("INSERT INTO users(UserInfo, BitMask) Values ?" + mysql.escape(client),
    (err, result)=>{
     if(!err){
         return res.json({ success: true, data: result, records_added: result.affected_rows });
        }
        return res.json({ success: false, data: err });
    })
});

此代码返回以下对象:

  {
    "success": false,
    "data": {
        "code": "EREQUEST",
        "number": 0,
        "originalError": {
            "sqlstate": "07002",
            "code": 0
        },
        "name": "RequestError"
        }
    }

有人知道我在这里想念什么吗?我在谷歌上找到的答案之一是问题来自在查询中多次使用占位符,但似乎并非如此。

谢谢您的帮助。

标签: javascriptsqlnode.js

解决方案


使用参数化查询,我也会选择async/await语法以获得更好的可读性

router.post("/add/client", async (request, res) => {
  try {
    const result = await pool.request()
      .input('userInfo', request.body.name)
      .input('bitmask', request.body.bitmask)
      .query("INSERT INTO users(UserInfo, BitMask) Values (@userInfo, @bitmask)");
    return res.json({ 
      success: true, 
      data: result, // I would avoid this, potential to leak DB info to the client
      records_added: result.affected_rows 
    });
  } catch (e) {
    // consider returning next(e) here and handling errors somewhere common
    return res.json({ 
      success: false, 
      data: err // don't do this, again potential to leak DB info to the client
    });
  }
});

推荐阅读