Я пытаюсь выполнить простой запрос по маршруту 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 неработающими?