繁体   English   中英

嵌套的javascript函数返回身份不明

[英]Nested javascript function returning unidentified

我在 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
});
});
}

你应该学习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;
   }
   })
}

问:有什么区别? A: await正在等待一个Promise被解析为value 因此, getProducts必须return一个Promise

在 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) })

你应该谷歌Promiseasync - await 。到你的 mongodb 的连接不会立即发生。你的代码调用连接到你的数据库,然后它甚至在建立连接之前就开始执行下一行代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM