nodejs mongodb官方节点包-异步功能不会返回数据

时间:2019-03-03 19:01:59

标签: node.js mongodb

我正在尝试编写一个简单的函数,以使用官方节点包“ mongodb”基于mongodb的匹配条件来获取特定实例的ID。

我的功能可以正常运行,因为我可以控制台记录数据,但是我无法return来使用数据,就像我看到的那样。

const mongo = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';

// Function for finding database id of device based on deviceKey, The database is written into 
// the code under the const 'db' as is the collection.

async function fetchId(deviceKey) {

    const client = await mongo.connect(url, { useNewUrlParser: true });
    const db = client.db('telcos');
    const collection = db.collection('device');

    try {
        await collection.find({"deviceKey": deviceKey}).toArray((err, response) => {              

            if (err) throw err;
            console.log(response[0]._id);   // << works logs _id
            return response[0]._id;         // << does nothing... ?
        })
    } finally {
        client.close();
    }
}

    // # fetchId() USAGE EXAMPLE
    //
    // fetchId(112233);   < include deviceKey to extract id
    //
    // returns database id of device with deviceKey 112233

// Run test on fetchId() to see if it works
fetchId("112233")
    .then(function(id) {
        console.dir(id); // << undefined
    })
    .catch(function(error) {
       console.log(error); 
    });

为什么我的测试返回undefined但我的函数内的console.log()有效?

2 个答案:

答案 0 :(得分:1)

您似乎在以奇怪的方式将回调代码与异步/等待代码结合在一起。您的函数fetchId根本不返回任何内容,这就是为什么在获取后看不到id的原因。

try {
  const response = await collection.find(...).toArray()
  return response[0]._id
}...

如果我们无法等待collection.find(...).toArray(),并且需要将其从使用回调手动转换为promises,则必须执行以下操作:

function fetchId (id) {
  // this function returns a promise
  return new Promise((resolve, reject) => {
    ...
    collection.find(...).toArray((err, response) => {
      // within the callback, returning values doesn't do anything
      if (err) return reject(err);
      return resolve(response[0]._id);
    })
  });
}

答案 1 :(得分:0)

您正在返回一个值,但是处理起来就像返回了一个Promise。请尝试以下代码。我尚未对其进行测试。

    const mongo = require('mongodb').MongoClient;
    const url = 'mongodb://localhost:27017';

    // Function for finding database id of device based on deviceKey, The database is written into 
    // the code under the const 'db' as is the collection.

    async function fetchId(deviceKey) {
    return new Promise((resolve,reject)=>{
        const client = await mongo.connect(url, { useNewUrlParser: true });
        const db = client.db('telcos');
        const collection = db.collection('device');

        try {
            await collection.find({"deviceKey": deviceKey}).toArray((err, response) => {              

                if (err) throw err;
                console.log(response[0]._id);   // << works logs _id
                return resolve(response[0]._id);         // << does nothing... ?
            })
        }
catch(error){
  return reject(error);
}
 finally {
            client.close();
        }
    });
    }

        // # fetchId() USAGE EXAMPLE
        //
        // fetchId(112233);   < include deviceKey to extract id
        //
        // returns database id of device with deviceKey 112233

    // Run test on fetchId() to see if it works
    fetchId("112233")
        .then(function(id) {
            console.dir(id); // << undefined
        })
        .catch(function(error) {
           console.log(error); 
        });