【问题标题】:node-postgres queries not returning anything in Express routes async routesnode-postgres 查询在 Express 路由异步路由中不返回任何内容
【发布时间】:2020-08-24 06:38:45
【问题描述】:

我正在尝试从快速路线运行一个简单的查询:

var router = require('express-promise-router')()
const { Pool } = require('pg')

const pool = new Pool({
  user: 'user',
  password: 'password',
  host: 'host',
  port: 1234,
  database: 'db'
})

router.get('/', async (req, res) => {
  console.log('OK')
  try {
    const { rows } = await pool.query('Select VERSION()')
    console.log(rows)
  }
  catch(e) {
    console.log(e)
  }
  console.log('DONE')
})
module.exports = router

'OK' 在发送请求后打印,但从不打印行、e 或 'DONE'。我直接从 https://node-postgres.com/guides/async-express 关注 async/await 方法。

我还遇到了 koa-router 的一个线程,其中人们遇到异步等待调用的问题,因为他们添加了一些不同步的中间件 https://github.com/ZijianHe/koa-router/issues/358.

我不确定是什么中间件会导致这种情况,但这是我的 app.js 初始化所有中间件:

var createError = require('http-errors');

var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var cors = require("cors");
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var dataRouter = require("./routes/data");
var uploadRouter = require("./routes/upload")
var fundingRouter = require('./routes/chartData/fundingOverview')
var testRouter = require('./routes/test')
var authRouter = require('./routes/auth')
var session = require('express-session')
var MongoStore = require('connect-mongo')(session)
var passport = require('passport')
const config = require('config')

const mongo = config.get('mongo')
const mongoose = require('mongoose')
mongoose.connect(mongo, {
  useUnifiedTopology: true,
  useNewUrlParser: true,
  useFindAndModify: false
}).then(res => {
  console.log('connected')
}).catch(err => {
  console.log(err)
})
var express = require('express');
const mountRoutes = require('./routes')
var app = express();




const bodyParser = require('body-parser')
app.use(bodyParser.json())
mountRoutes(app)
app.use(cors())


var sessionMiddleWare = session({
  secret: 'top session secret',
  store: new MongoStore({ mongooseConnection: mongoose.connection }),
  resave: true,
  saveUninitialized: true,
  unset: 'destroy',
  cookie: {
    httpOnly: false,
    maxAge: 1000 * 3600 * 24,
    secure: false, // this need to be false if https is not used. Otherwise, cookie will not be sent.
  }
})
app.use(sessionMiddleWare)


// Run production React server on Node server

if(process.env.NODE_ENV === 'production') {
   app.use(express.static('client/build'))

app.get('*', (req, res) => {
  res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'))
})
}

// End Run production React Server on Node Server


// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({
  extended: false
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


// app.use('/upload', uploadRouter)
// app.use('/', indexRouter);
// app.use('/users', usersRouter);
// app.use('/data', dataRouter)
// app.use('/funding', fundingRouter)
// app.use('/login', usersRouter)
// app.use('/auth', authRouter)

// catch 404 and forward to error handler
// app.use(function(req, res, next) {
//   next(createError(404));
// });

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

我在正文解析器之后直接安装路由。这是唯一在路由之前调用的中间件,它是我将数据输入后端所必需的。

我可以通过将它放入脚本文件并运行“node test.js”(没有路由器的 IE)来执行这个简单的查询,它工作正常,所以我知道 node-postgre 没有问题。

我知道这是调用堆栈不完全同步的问题,但我对目前还没有什么感到困惑。我什至在前端 async/await 上进行了 axios 调用,但没有运气(但我认为没有必要)。

任何指导都会有很大帮助。

编辑:

我创建了一个新的 express 框架并连接了我的前端,以使用相同的代码调用新的 express 服务器上的路由,它工作正常。这让我发现调用没有完成,因为我正在使用 Nodemon 运行服务器。当我使用“yarn start”启动服务器时,异步调用得到正确处理。现在的问题是 nodemon 中的什么使异步路由器调用不起作用?

【问题讨论】:

    标签: javascript node.js express async-await node-postgres


    【解决方案1】:

    您需要在中间件中完成请求/响应周期。

    所以在你的代码中:

    router.get('/', async (req, res) => {
        console.log('OK')
        try {
            const { rows } = await pool.query('Select VERSION()')
            console.log(rows)
            res.status(200).json(rows)
        }
        catch(e) {
            console.log(e)
            res.status(500).json(e)
        }
        console.log('DONE')
    })
    

    【讨论】:

    • 不幸的是,这不起作用。感觉查询挂了,执行后没有代码。
    • 您的数据库端口是否正确?您的代码显示 1234,但默认 postgres 端口是 5432
    • 是的,我可以在常规脚本文件中执行查询并获得结果,只是在路由器中调用时不起作用。
    猜你喜欢
    • 2018-01-29
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2019-08-16
    • 2022-06-29
    • 1970-01-01
    • 2022-01-04
    • 2018-04-23
    相关资源
    最近更新 更多