Вложенная функция JavaScript, возвращающая неопознанный - PullRequest
0 голосов
/ 03 сентября 2018

У меня проблемы с возвратом некоторых значений базы данных на мой сервер в 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 голосов
/ 03 сентября 2018

Здесь попробуйте этот код в 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;
}

, а также добавьте await на свой API

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

})

Вы должны Google Promise, async - await. Соединение с вашим mongodb не происходит мгновенно. Ваш код выполняет вызов для подключения к вашей базе данных, затем он начинает выполнять следующую строку кода еще до того, как это соединение Установлено.

0 голосов
/ 03 сентября 2018

вы должны узнать о asynchronous, callback и promise в javascript, после этого вы сможете легко работать с javascript, и мой код ниже может быть вам понятен.

К счастью для нас, сейчас 2018, синтаксис запуска synchronous function очень прост с async / await. В этом случае getProducts должен быть запущен synchronously и должен быть таким:

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

edit: 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;
   }
   })
}

Q: какая разница? A: await ожидает разрешения Promise с value. Так что getProducts должен return a Promise.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...