node- postgres запросы ничего не возвращают в Express routes asyn c routes - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь выполнить простой запрос по маршруту express:

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

«ОК» печатается после отправки запроса, но строки, e или «DONE» никогда не печатаются. Я следую методу async / await непосредственно из https://node-postgres.com/guides/async-express.

Я также наткнулся на поток для koa-router, где у людей были проблемы с asyn c await звонки из-за добавленного ими промежуточного программного обеспечения, которое не было синхронным https://github.com/ZijianHe/koa-router/issues/358.

Я не уверен, какое промежуточное ПО вызовет это, но вот мое приложение. 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.

Я знаю, что это проблема с тем, что стек вызовов не полностью синхронно, но я не понимаю, чего еще нет. Я даже сделал вызов ax ios в интерфейсе async / await безуспешно (хотя я не думаю, что это было необходимо).

Любое руководство очень поможет.

РЕДАКТИРОВАТЬ:

Я создал скелет fre sh express и подключил свой интерфейс для вызова маршрута на новом сервере express с тем же кодом, это сработало. Это привело меня к выводу, что вызов не завершается, потому что я запускал сервер с Nodemon. Когда я запускаю сервер, используя «yarn start», вызовы asyn c обрабатываются правильно. Теперь вопрос в том, что в nodemon делает вызовы маршрутизатора asyn c неработающими?

1 Ответ

0 голосов
/ 08 мая 2020

Вам необходимо завершить sh цикл запроса / ответа в вашем промежуточном программном обеспечении.

Итак, в вашем коде:

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')
})
...