Невозможно добавить переменную, извлеченную из API в базу данных - PullRequest
0 голосов
/ 08 октября 2019

проблема в том, что поле в базе данных, где должны быть данные из запроса API, говорит "0 полей". Я думаю, это потому, что Монго вставляет объект в базу данных до того, как ответ API будет в переменной объекта. поэтому я думаю, что мне нужно позволить функции вставки базы данных подождать, пока не будет выполнен запрос API.

Кто-нибудь знает, как я могу это сделать?

const express = require('express');
const bodyParser = require('body-parser');
const exphbs = require('express-handlebars');
const path = require('path');
const fs = require('fs');
const fetch = require('node-fetch');

var mongodb = require('mongodb')
var mongoDbQueue = require('mongodb-queue')

const url = 'mongodb://localhost:27017/'
const client = new mongodb.MongoClient(url, { useNewUrlParser: true })

const app = express();


// View engine setup
app.engine('handlebars', exphbs());
app.set('view engine', 'handlebars');
app.set('views', __dirname);

// Static folder
app.use('/public', express.static(path.join(__dirname, 'public')));

// Body Parser Middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get('/', (req, res) => {
  res.render('main');
});

app.post('/send', (req, res) => {
  var item = {
  name: req.body.name,
  age: req.body.age,
country: req.body.country,
  isValid:
 fetch(*/normaly working url inside here*/)  
      .then(res => res.json())
      .then(data => isValid = data)
      .then(() => console.log(isValid))

}



client.connect(err => {
    const db = client.db('test')
    const queue = mongoDbQueue(db, 'my-queue')


  queue.add(item, (err, id) => {
 
  })

  })



});



app.listen(3000, () => console.log('Server started...'));

.then(() => console.log(equivalent)) дает мне правильное значение, поэтому оно не имеет отношения к API

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Не совсем понятно, чего вы здесь добиваетесь, но я предполагаю, что вы хотите добавить запись в базу данных, когда обещание получения было выполнено на маршруте / send. В этом случае вам необходимо выполнить рефакторинг своего кода следующим образом:

const express = require('express');
const bodyParser = require('body-parser');
const exphbs = require('express-handlebars');
const path = require('path');
const fs = require('fs');
const fetch = require('node-fetch');

var mongodb = require('mongodb')
var mongoDbQueue = require('mongodb-queue')

const url = 'mongodb://localhost:27017/'
const client = new mongodb.MongoClient(url, { useNewUrlParser: true })

const app = express();

// View engine setup
app.engine('handlebars', exphbs());
app.set('view engine', 'handlebars');
app.set('views', __dirname);

// Static folder
app.use('/public', express.static(path.join(__dirname, 'public')));

// Body Parser Middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get('/', (req, res) => {
    res.render('main');
});

app.post('/send', (req, res) => {
    let name = req.body.name;
    let age = req.body.age;
    let country = req.body.country;
    fetch( /* normaly working url inside here */)
        .then(res => res.json())
        .then(data => {
            let item = { name, age, country, isValid: true };
            // data is ready to be used or added to the database at this point:
            client.connect(err => {
                const db = client.db('test')
                const queue = mongoDbQueue(db, 'my-queue')
                queue.add(item, (err, id) => {
                })
            })

        })
        .catch((error) => console.log(error));

});

app.listen(3000, () => console.log('Server started...'));
0 голосов
/ 08 октября 2019

Проблема связана с асинхронной природой API выборки. Значение внутри isValid не разрешается до более позднего момента времени. Также вы используете значение неправильно.

Приведенный ниже код ожидает ответа, устанавливает значение и обновляет базу данных в правильной области.

app.post('/send', (req, res) => {
 fetch(*/normaly working url inside here*/)  
      .then(res => res.json())
      .then(isValid => {
       var item = {
        name: req.body.name,
        age: req.body.age,
        country: req.body.country,
        isValid //same as isValid : isValid
      }
      client.connect(err => {
       if(!err) { // error check
         const db = client.db('test');
         const queue = mongoDbQueue(db, 'my-queue');
         queue.add(item, (err, id) => {})
       }
      });
    });
});
...