如何使用节点js在sql db上插入记录?

时间:2019-01-30 13:29:52

标签: javascript sql node.js

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

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

我也尝试过"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"
        }
    }

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用参数化查询,我还会选择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
    });
  }
});