等待不是等待承诺解决

时间:2021-02-16 05:52:45

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

大家晚上好!

我已经被这个问题困住了一段时间,我似乎无法通过纯粹的谷歌搜索来解决它,所以我与大家联系。

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

现在我的路线都设置好了,我的控制器都设置好了,我的数据库光标也都设置好了。当我调用我定义的路由时,它运行 getAllUsers() 控制器函数,并在该控制器函数内部使用 DB 游标上的 getAllUsers() 函数调用数据库,我希望代码等待DB 游标在继续之前返回其结果,但它不是,我不知道为什么。 DB 游标代码确实有效,因为它可以获取数据并将其记录下来。

非常感谢您的帮助,我已经将三段代码放在下面,如果您需要我展示更多,请告诉我。

p.s 忽略“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;
        }
    },
}

1 个答案:

答案 0 :(得分:1)

混合回调和承诺通常不是一个好主意。尽量不要将回调传递给 const arr3 = arr2.map(i => aar1[i]) 方法,您应该能够client.connect 按预期执行承诺

await