[英]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.