[英]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中的asynchronous
、 callback
和promise
,之后你就可以輕松地使用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) })
你應該谷歌Promise
, async
- await
。到你的 mongodb 的連接不會立即發生。你的代碼調用連接到你的數據庫,然后它甚至在建立連接之前就開始執行下一行代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.