Node.js - MongoDB - 异步 GET API 如何等待 Promise?

问题描述 投票:0回答:1

我是 Node.js 和 MongoDB 的新手,但我正在尝试找出如何最好地在 Node.js/MongoDB/Express 中实现 GET 端点

出于某种原因,我认为这是因为我的数据库是 Azure Cosmos MongoDB,我建立连接的唯一方法是使用

async
,因为我理解的同步数据库连接尝试会跳过任何其他代码,并且连接从未建立。

这是我到目前为止的代码:

    const app = express();

    app.get('/jobs', async (req, res) => { 
    var url = "mongodb://****************"
    const  client = new  MongoClient(url);
    await client.connect();
    console.log("connected to database");<--This works!
    const database = client.db("jobinfoaccount");<-This is the name of my Azure DB Resource
    const query = {"jobrequests":"123"}
    //jobrequests is the name of the collection in jobinfoaccount 
    var collection = database.collection("jobrequests").find().toArray(function (err,results) {
      console.log(results);
      res.json("Loaded" + results)
    })
  });

我目前遇到的问题是执行就在这条线上发生:

    var collection = database.collection("jobrequests").find().toArray (function (err,results) 

执行甚至没有达到这些行:

      console.log(results);
      res.json("Loaded" + results)

当我查看 VSCode 中的 watch 语句时,它说那里有一个 Promise,但我不知道如何处理这个:

当我在 Postman 中调用端点时,它只是旋转:

更新 当我尝试使用等待时,如下所示:

var collection =  await database.collection("jobrequests").find().toArray (function (err,results) {

我仍然没有看到它到达下一个第 70 行,直接到达第 73 行:

但是收藏似乎已经兑现了承诺:

现在我想知道这些代码行之一是否有问题,特别是

jobinfoaccount
jobrequests

const database = client.db("jobinfoaccount");
var collection =  await database.collection("jobrequests").find().toArray (function (err,results) {

这是我在 Azure 中的资源名称:

这是集合名称:

提前致谢..

node.js mongodb express azure-cosmosdb
1个回答
0
投票

尝试找出如何最好地在 Node.js/MongoDB/Express 中实现 GET 端点。

以下是我尝试在 Node.js/MongoDB/Express 中实现 GET 端点的步骤:

  • 我尝试的代码在服务器启动时创建单个 MongoDB 连接,然后为每个请求重用它。它避免了为每个请求重复创建和关闭连接。

  • 一致使用async/await使代码更易于理解,并以更好的方式处理异步任务。

  • 通过使用

    console.log(results)
    语句将检索到的数据记录到控制台,然后将其作为响应传递,可以更轻松地调试和理解正在检索的数据。

  • 我尝试了一些使用

    try/catch
    的代码来捕获和处理使用数据库时出现的任何错误。

  • 下面的代码将接收到的数据作为 JSON 响应传输

    (res.json(results))
    ,使客户端可以轻松操作数据。

  • 为了更好的代码结构和可读性,下面的代码中将路由定义和 MongoDB 连接设置分开。

我尝试过的代码:

const express = require('express');
const { MongoClient } = require('mongodb');

const app = express();
const port = 3000; 
const url = '****'; 

app.use(express.json());
const client = new MongoClient(url);

async function connectToDatabase() {
  try {
    await client.connect();
    console.log('Connected to MongoDB');
  } catch (error) {
    console.error('Error connecting to MongoDB:', error);
  }
}
connectToDatabase();

// Retrieve all data from the database
app.get('/jobs', async (req, res) => {
  try {
        const database = client.db('newDb');
        const collection = database.collection('newColl'); 

        const results = await collection.find().toArray();
        console.log(results); 
        res.json(results);
  } catch (error) {
        console.error('Error:', error);
        res.status(500).json({ error: 'An error occurred' });
  }
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

输出: 在控制台中:

Server is running on port 3000
Connected to MongoDB
[
  {
    _id: new ObjectId("64f57a8e93de8d013cb645af"),
    id: '1',
    title: 'Job 1',
    description: 'This is the first job',
    location: 'New York'
  },
  {
    _id: new ObjectId("64f57ab993de8d013cb645b0"),
    id: '2',
    title: 'Job 2',
    description: 'This is the second job',
    location: 'Los Angeles'
  }
]

在服务器中:localhost:3000/jobs

[
    {
        "_id": "64f57a8e93de8d013cb645af",
        "id": "1",
        "title": "Job 1",
        "description": "This is the first job",
        "location": "New York"
    },
    {
        "_id": "64f57ab993de8d013cb645b0",
        "id": "2",
        "title": "Job 2",
        "description": "This is the second job",
        "location": "Los Angeles"
    }
]
© www.soinside.com 2019 - 2024. All rights reserved.