Node-postgres将新记录插入我的数据库不会返回新条目的数据

Mic*_* P. 4 javascript postgresql express node-postgres

这是执行查询的路径:

userRouter.route("/new")
    .post(function (req, res) {
        var user = req.body;
        pg.connect(connectionString, function (error, client, done) {
            var queryString = "INSERT INTO Users (id, first_name, last_name) VALUES (" + "'" + [user.id, user.first_name, user.last_name].join("','") + "'" + ")";
            console.log(queryString);
            client.query(queryString, function (error, result) {
                console.log(result.rows);
                done();
            });
        });
    });
Run Code Online (Sandbox Code Playgroud)

问题是我试图从第二个控制台引用的"结果"值基本上是空白的:

{
  command: 'INSERT',
  rowCount: 1,
  oid: 0,
  rows: [],
  fields: [],
  _parsers: [],
  RowCtor: null,
  rowAsArray: false,
  _getTypeParser: [Function: bound ]
 }
Run Code Online (Sandbox Code Playgroud)

不应该result.rows包含一个数组,其中包含一个表示我刚刚在数据库中创建的行的对象?

Mic*_* P. 9

好吧,我已经弄明白了.

显然,我试图使用Node-Postgres中尚未实现的功能,如下所述:https://github.com/brianc/node-postgres/wiki/Todo

在查询结果回调中插入/更新/选择行计数

虽然这在当然非常棒,但可以通过向查询添加RETURNING id或甚至RETURNING*来获取行为.这适用于我的单列.我将测试这个包的倍数和处理该情况.我很确定在postgres中一定是可能的.

所以,我更新了我的查询以返回新行的所有数据:

var queryString = "INSERT INTO Users (first_name, last_name) VALUES (" + "'" + [user.first_name, user.last_name].join("','") + "'" + ") RETURNING *";
Run Code Online (Sandbox Code Playgroud)

然后我修改了查询账户为"行"的事件处理程序,当进入到数据库中的新行是触发.在此事件处理程序的上下文中,我可以访问新的行数据(根据上面的"RETURNING"参数:

var query = client.query(queryString, function (error, result) {
    done();
});

query.on("row", function (row, result) {
    console.log("Inside the row event handler.");
    res.render("users/show", { user: row });
});
Run Code Online (Sandbox Code Playgroud)

Aaaand它的作品!

  • 我认为你的查询很容易受到sql注入的攻击。使用模板的 pg 功能 `client.query('INSERT INTO Users (first_name, last_name) VALUES ($1, $2) RETURNING *', [user.first_name, user.last_name])`。它具有内置消毒功能。 (2认同)

Nad*_*smi 7

更新查询并在查询末尾添加“ RETURNING *

  var queryString = "INSERT INTO Users (id, first_name, last_name) VALUES (" + "'" + [user.id, user.first_name, user.last_name].join("','") + "'" + ") RETURNING *";
Run Code Online (Sandbox Code Playgroud)

得到 result.rows[0]