Node.js MongDB使用异步/等待查询数据

时间:2019-07-31 10:25:22

标签: node.js mongodb asynchronous async-await

我正在使用节点模块mongodb v3.2.7,并使用express来实现我的api

我使用callback。而且,效果很好

函数findItem

const findItem = function (id, callback) {
  if (db) {
    const collection = db.collection('transaction')
    collection.find({ user_id: id})
      .project({ ready: 1, online: 1, status: 1})
      .toArray(function (err, docs) {
        if (err) {
          callback(err)
        } else {
          callback(null, docs)
        }
      })
  }
}

我的api

app.get('/', (req, res) => {
  try {
    if (req.query.user_id) {
      const contentType = 'application/json'

      res.set({ 'Access-Control-Allow-Origin': '*',
        'Content-Type': contentType })

      const user_id = parseInt(req.query.user_id, 0)
      findItem(user_id , function (err, docs) {
        if (err) {
          res.status(500).end()
          return res.send(err)
        }
        const data = processData(docs)
        console.log('data', data)
        return res.send(data)
      })
    } else {
      res.send()
    }
  } catch (ex) {
    console.log(ex)
  }
})

然后,我尝试使用async/await而不是callback。但是,它不起作用。我犯了什么错误?

功能findItemAsyncAwait

const findItemAsyncAwait = async function (id) {
  if (db) {
    const collection = db.collection('transaction')
    var docs = await collection.find({ user_id: id })
      .project({ ready: 1, online: 1, status: 1})
      .toArray()
    return docs
  }
}

我更改过的api

app.get('/', (req, res) => {
  try {
    if (req.query.user_id) {
      const contentType = 'application/json'

      res.set({ 'Access-Control-Allow-Origin': '*',
        'Content-Type': contentType })

      const user_id = parseInt(req.query.user_id, 0)
      const promiseDocs = findItemAsyncAwait(user_id)
      promiseDocs.then((docs) => {
        console.log('docs', docs) // <= docs [], docs is an empty array without any document
        const data = processData(docs)
        console.log('data', data)
        return res.send(data)
      }).catch((err) => {
        res.status(500).end()
        return res.send(err)
      })
    } else {
      res.send()
    }
  } catch (ex) {
    console.log(ex)
  }
})

我仍然陷在这个问题上。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您必须等待收集

const findItemAsyncAwait = async function (id) {
  if (db) {
    return await db.collection('transaction')
      .find({ user_id: id })
      .project({ ready: 1, online: 1, status: 1})
      .toArray()
  }
}