Node.js 将数据从数据库(db.js)返回到节点(app.js)时出现问题

Node.js 将数据从数据库(db.js)返回到节点(app.js)时出现问题,node.js,postgresql,Node.js,Postgresql,我试图通过post请求从node.js中的postgres数据库请求数据。最终,这些数据将被发送到react前端。 我正在从数据库中获取正确的数据,但似乎无法将这些数据返回到app.js(我有点像node.js noob)。我有两个文件app.js和db.js 这里是app.js const express = require('express'); const morgan = require('morgan'); const helmet = require('helmet'); const

我试图通过post请求从node.js中的postgres数据库请求数据。最终,这些数据将被发送到react前端。 我正在从数据库中获取正确的数据,但似乎无法将这些数据返回到app.js(我有点像node.js noob)。我有两个文件app.js和db.js

这里是app.js

const express = require('express');
const morgan = require('morgan');
const helmet = require('helmet');
const cors = require('cors')
const db = require('./db')
const bodyParser = require('body-parser')
const middlewares = require('./middlewares');


const app = express();
app.use(cors());
app.use(morgan('dev'));
app.use(helmet());
// Parse URL-encoded bodies (as sent by HTML forms)
app.use(bodyParser.urlencoded({ extended: false }))
// Parse JSON bodies (as sent by API clients)
app.use(express.json());

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  next();
});

app.get('/api', (req, res) => {
  res.send({ express: 'Server online' });

});

app.post('/layer', (req, res, next) => {
  var layer = req.body.menu;
  var geometry = db.layer(layer);
  console.log(geometry);
  res.set('Content-Type', 'application/json')
  //const body = res.body()
});


app.use(middlewares.notFound);
app.use(middlewares.errorHandler);

module.exports = app;
这里是db,js

const { Pool, Client } = require('pg')

const connection = new Pool({
    user: 'postgres',
    host: 'localhost',
    database: 'dbtemp',
    password: 'password',
    port: 5432,
    max: 20,
    connectionTimeoutMillis: 2000,
})
connection.connect(function(err) {
    if (err) throw err;
});

connection.on('connect', () => {
console.log("connected to database on port: " );
});

module.exports = { 
    layer: function(layer) { 
        connection.query('SELECT ST_AsGeoJSON(geom) FROM nzta_centrelines', (err, result) => {
            if (err) {
                return console.error('Error executing query', err.stack)
            }
            var geometry = result.rows[0].st_asgeojson;
            console.log(geometry);
            return result;
        })
    }
}
我正在从db.js将正确的数据记录到控制台 输出:


如何将查询结果发送到app.js并发送到网页(React前端)。我猜想当数据准备好时它需要一个回调?< /p> 您可能想考虑使用一个承诺或回调

  • 承诺方法
  • db.js

    ...
    module.exports = { 
        layer: function(layer) { 
            return new Promise((resolve, reject) => {
                connection.query('SELECT ST_AsGeoJSON(geom) FROM nzta_centrelines', (err, result) => {
                    if (err) {
                        console.error('Error executing query', err.stack)
                        return reject(err);
                    }
                    var geometry = result.rows[0].st_asgeojson;
                    console.log(geometry);
                    return resolve(result);
                })
            })
        }
    }
    
    ...
    app.post('/layer', async (req, res, next) => {
        var layer = req.body.menu;
        var geometry = await db.layer(layer);
        console.log(geometry);
        res.set('Content-Type', 'application/json')
        //const body = res.body()
    });
    
    module.exports = { 
        layer: function(layer, cb) { 
            connection.query('SELECT ST_AsGeoJSON(geom) FROM nzta_centrelines', (err, result) => {
                if (err) {
                    console.error('Error executing query', err.stack)
                    return cb(err)
                }
                var geometry = result.rows[0].st_asgeojson;
                console.log(geometry);
                return cb(null, geometry);
            })
        }
    }
    
    ...
    app.post('/layer', (req, res, next) => {
        var layer = req.body.menu;
        db.layer(layer, (err, geometry) => {
            if (err) throw err;
                console.log(geometry);
        res.set('Content-Type', 'application/json')
        //const body = res.body()
        });
    });
    
    app.js

    ...
    module.exports = { 
        layer: function(layer) { 
            return new Promise((resolve, reject) => {
                connection.query('SELECT ST_AsGeoJSON(geom) FROM nzta_centrelines', (err, result) => {
                    if (err) {
                        console.error('Error executing query', err.stack)
                        return reject(err);
                    }
                    var geometry = result.rows[0].st_asgeojson;
                    console.log(geometry);
                    return resolve(result);
                })
            })
        }
    }
    
    ...
    app.post('/layer', async (req, res, next) => {
        var layer = req.body.menu;
        var geometry = await db.layer(layer);
        console.log(geometry);
        res.set('Content-Type', 'application/json')
        //const body = res.body()
    });
    
    module.exports = { 
        layer: function(layer, cb) { 
            connection.query('SELECT ST_AsGeoJSON(geom) FROM nzta_centrelines', (err, result) => {
                if (err) {
                    console.error('Error executing query', err.stack)
                    return cb(err)
                }
                var geometry = result.rows[0].st_asgeojson;
                console.log(geometry);
                return cb(null, geometry);
            })
        }
    }
    
    ...
    app.post('/layer', (req, res, next) => {
        var layer = req.body.menu;
        db.layer(layer, (err, geometry) => {
            if (err) throw err;
                console.log(geometry);
        res.set('Content-Type', 'application/json')
        //const body = res.body()
        });
    });
    
  • 回调方法
  • db.js

    ...
    module.exports = { 
        layer: function(layer) { 
            return new Promise((resolve, reject) => {
                connection.query('SELECT ST_AsGeoJSON(geom) FROM nzta_centrelines', (err, result) => {
                    if (err) {
                        console.error('Error executing query', err.stack)
                        return reject(err);
                    }
                    var geometry = result.rows[0].st_asgeojson;
                    console.log(geometry);
                    return resolve(result);
                })
            })
        }
    }
    
    ...
    app.post('/layer', async (req, res, next) => {
        var layer = req.body.menu;
        var geometry = await db.layer(layer);
        console.log(geometry);
        res.set('Content-Type', 'application/json')
        //const body = res.body()
    });
    
    module.exports = { 
        layer: function(layer, cb) { 
            connection.query('SELECT ST_AsGeoJSON(geom) FROM nzta_centrelines', (err, result) => {
                if (err) {
                    console.error('Error executing query', err.stack)
                    return cb(err)
                }
                var geometry = result.rows[0].st_asgeojson;
                console.log(geometry);
                return cb(null, geometry);
            })
        }
    }
    
    ...
    app.post('/layer', (req, res, next) => {
        var layer = req.body.menu;
        db.layer(layer, (err, geometry) => {
            if (err) throw err;
                console.log(geometry);
        res.set('Content-Type', 'application/json')
        //const body = res.body()
        });
    });
    
    app.js

    ...
    module.exports = { 
        layer: function(layer) { 
            return new Promise((resolve, reject) => {
                connection.query('SELECT ST_AsGeoJSON(geom) FROM nzta_centrelines', (err, result) => {
                    if (err) {
                        console.error('Error executing query', err.stack)
                        return reject(err);
                    }
                    var geometry = result.rows[0].st_asgeojson;
                    console.log(geometry);
                    return resolve(result);
                })
            })
        }
    }
    
    ...
    app.post('/layer', async (req, res, next) => {
        var layer = req.body.menu;
        var geometry = await db.layer(layer);
        console.log(geometry);
        res.set('Content-Type', 'application/json')
        //const body = res.body()
    });
    
    module.exports = { 
        layer: function(layer, cb) { 
            connection.query('SELECT ST_AsGeoJSON(geom) FROM nzta_centrelines', (err, result) => {
                if (err) {
                    console.error('Error executing query', err.stack)
                    return cb(err)
                }
                var geometry = result.rows[0].st_asgeojson;
                console.log(geometry);
                return cb(null, geometry);
            })
        }
    }
    
    ...
    app.post('/layer', (req, res, next) => {
        var layer = req.body.menu;
        db.layer(layer, (err, geometry) => {
            if (err) throw err;
                console.log(geometry);
        res.set('Content-Type', 'application/json')
        //const body = res.body()
        });
    });
    

    使用的
    pg
    库已经支持承诺,没有必要将其包装到另一个承诺层中。