【发布时间】: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