等待不是在等待承诺解决



大家晚上好!

我在这个问题上被困了一段时间,我似乎无法通过单纯的谷歌来解决它,所以我联系了你们所有人。

背景:我正在为我们公司的所有实习生编写一个小应用程序来处理所有的日历和基本项目信息,因为我的老板经常问我他们在做什么,我想给他一些他可以看到的东西,所以我决定用代码来解决这个问题,同时在这个过程中学习一个新的框架(Express)。

现在我的路由都设置好了,控制器都设置好了,DB光标也设置好了。当我调用我定义的路由时,它运行getAllUsers()控制器函数,并在该控制器函数中使用DB游标上的getAllUsers()函数调用数据库,我希望代码在继续之前等待DB游标返回其结果,但它不是,我无法找出原因。DB游标代码确实可以工作,因为它可以很好地获取数据并将其注销。

任何帮助将是非常感激的,我已经把三个比特的代码在下面的问题,让我知道如果你需要我展示更多。

p。让我们忽略'here1', 'here2'等调用,这就是我如何计算在任何时间点发生的事情的方法。

routes.ts

import express from 'express';
import controllers from './controller.js';
export default (app: express.Application) => {
// Users
app.route('/users').get(controllers.getAllUsers)
app.route('/users').post(controllers.postNewUser)
app.route('/users').delete(controllers.deleteUser)
app.route('/user/:emailAddress').get(controllers.getUser)
app.route('/user/:emailAddress').put(controllers.updateUser)
}

controllers.ts

import express from 'express';
import dbcursor from '../services/dbcursor.js';
// Interfaces
import { Project, User } from '../services/interfaces.js'
const controllers = {
// Users
getAllUsers: async (req: express.Request, res: express.Response) => {
try {
const dbRes = await dbcursor.getAllUsers();
console.log('here 3', dbRes)
res.status(200).json({
message: 'Users fetched succesfully!',
dbRes: dbRes
});
} catch (err) {
res.status(400).json({
message: 'Failed to get users.',
dbRes: err
});

}
},
}

dbcursor.ts

import dotenv from 'dotenv';
import mongodb from 'mongodb' 
dotenv.config();
// Interfaces
import { User, Project } from './interfaces'
// DB Client Creation
const { MongoClient } = mongodb;
const uri = process.env.DB_URI || ''
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
const dbcursor = {

// Users
getAllUsers: async () => {
let dbRes;
try {
await client.connect(async err => {
if (err) throw err;
console.log("here 1", dbRes)
const collection = client.db("InternManager").collection("Users");
dbRes = await collection.find().toArray()
console.log("here 2", dbRes)
return dbRes;
});
} catch(err: any) {
return err;
}
},
}

将回调和承诺混合使用通常不是个好主意。尝试不传递回调到client.connect方法,你应该能够await的承诺,如预期的

getAllUsers: async () => {
let dbRes;
try {
await client.connect();
console.log("here 1", dbRes)
const collection = client.db("InternManager").collection("Users");
dbRes = await collection.find().toArray()
console.log("here 2", dbRes)
return dbRes;
} catch(err: any) {
throw err; // If you're just catching and throwing the error, then it would be okay to just ignore it 
}
},

最新更新