10

クエリが実行されているルートは次のとおりです。

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();
            });
        });
    });

問題は、2 番目のコンソール内から参照しようとしている「結果」の値が基本的に空白であることです。

{
  command: 'INSERT',
  rowCount: 1,
  oid: 0,
  rows: [],
  fields: [],
  _parsers: [],
  RowCtor: null,
  rowAsArray: false,
  _getTypeParser: [Function: bound ]
 }

データベースで作成したばかりの行を表すオブジェクトを含む配列を result.rows に含めるべきではありませんか?

4

2 に答える 2

17

わかりました、私はそれを理解しました。

どうやら、 https ://github.com/brianc/node-postgres/wiki/Todo で説明されているように、Node-Postgres にまだ実装されていない機能を使用しようとしていたようです。

クエリ結果コールバックでの行数の挿入/更新/選択

もちろん、これは非常に素晴らしいことですが、クエリに RETURNING id または RETURNING * を追加することで、動作を取得することができます。これは、私にとって単一の列ではうまく機能します。これを倍数でテストし、このパッケージでそのケースを処理します。postgresでそれが可能でなければならないと確信しています。

そこで、新しい行のすべてのデータを返すようにクエリを更新しました。

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

次に、データベースに新しい行が入力されたときにトリガーされる「行」イベント ハンドラーを考慮して、クエリを変更しました。新しい行データにアクセスできるのは、このイベント ハンドラーのコンテキスト内です (上記の「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 });
});

ああ、それはうまくいきます!

于 2016-01-23T20:36:18.507 に答える