嵌套的javascript函数返回未知

时间:2018-09-03 18:52:56

标签: javascript mongodb callback

我在将一些数据库值返回到Nodejs中的服务器时遇到麻烦,看来这些值丢失了。

结果记录良好,我正在查找数据,但返回时丢失了。

exports.getProducts = async function () {

return await MongoClient.connect(url, {useNewUrlParser: true}, async function 
(err, client) {
let db = client.db(dbName);
return await db.collection('products').find({}).toArray(async function (err, 
result) {
  if (err) throw err;
  client.close();
  console.log(result);
  return await result
});
});
}

2 个答案:

答案 0 :(得分:0)

您应该了解javascript中的asynchronouscallbackpromise,之后您可以轻松使用javascript,并且下面的代码对您来说是可以理解的。

对我们来说幸运的是,现在是2018年,使用async / await运行synchronous function的语法非常容易。在这种情况下,getProducts应该运行synchronously,并且应该像这样:

app.get('/api/products/', async function(req, res, next) {
    const myData = await mongo.getProducts();
    res.send(myData);
});

编辑:mongodb.js应该稍作更新:

exports.getProducts = function() {
   return mongoClient.connect(url, {useNewUrlParser: true }, function(err, client) { 
      let db = client.db(dbName);

      return db.collection('products').find({}).toArray( function(err, result) { . 
          if(err) throw err;
          client.close();
          return result;
   }
   })
}

问:有什么区别? 答:await正在等待Promise被解决。因此,value必须getProductsreturn

答案 1 :(得分:0)

在mongodb.js中尝试此代码

const MongoClient=require('mongodb').MongoClient
const assert=require('assert')


const url='mongodb://localhost:27017';

const dbName="productstoredb"


var Result;
var MongoDB;

var MongoConnect = new Promise((resolve, reject) => {
    var Db = MongoClient.connect(url, { useNewUrlParser: true }, function (err, client) {
        if (err) {
            resolve("error")
        }
        MongoDB = client.db("dbName")
        MongoDb.db(dbName)
        resolve("connected to the Database")
    })
})

var MongoView = new Promise((resolve, reject) => {
    MongoDB.collection("products").find().toArray(function (err, result) {
        if (err) resolve("ERROR");
        Result = result;
        resolve("success")
    })
})

exports.getProducts = async function () {
    console.log(await MongoConnect);
    console.log(await MongoView);
    return Result;
}

并在您的api上添加await

app.get('/api/products', function (req, res) {
    var mydata = await mongo.getProducts();
    res.send(Mydata)

})

您应该在Google Promiseasync-await上进行搜索。与mongodb的连接不会立即发生。您的代码会调用该程序以连接到数据库,然后开始执行下一行代码,甚至在建立连接之前。