簡體   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