Дождитесь завершения обработки перед сохранением в базе данных [Решить] - PullRequest
1 голос
/ 17 июня 2020

Я использую express JS и Node JS для создания REST API

Я хотел бы создать объект json с помощью cheerio, который затем добавил бы в свою базу данных mongoDB.

Обещание - это практическое решение, но у меня все еще возникают проблемы с его созданием в JavaScript.

Я сделал этот тестовый код

Я создал контроллер с этой функцией, которая будет анализировать URL-адрес с помощью cherrio.

параметр url передается из почтового маршрута из моего API

exports.scrapData = (url) => {
   console.log('Scrapping data', url);
   return url;
}

Эта функция другого контроллера извлекает данные и сохраняет его в базе данных.

const Post = require('../models/Post');
const exportDataCtrl = require('./exportData');

exports.createDataWithUrl = (req, res, next) => {
  let url = req.params.url;

  const dataScrap = exportDataCtrl.scrapData(url);

  const post = new Post({
    ...dataScrap
  })

  post.save()
    .then(post => res.status(201).json({ message:'success !'}))
    .catch(error => res.status(400).json({ error:error })) 
}

EDIT: Добавление сообщения. js код, Post - это модель базы данных mongoDB, которую я создал для выполнения своих тестов.

const mongoose = require('mongoose');

const postSchema = mongoose.Schema({
  title: { type:String, required:true },
  description: { type:String, required:true },
  contact_name: { type:String, required:true }
})

module.exports = mongoose.model('Post', postSchema);

Я попытался создать обещание с помощью функции scrap Data и функции save mongoDB, но я все еще понимаю, что функция затем возвращает неопределенный результат.

Думаю, что нет ' Я хорошо понимаю обещания, и ошибка должна быть очевидна.

Заранее благодарю вас за вашу помощь и ответы.

1 Ответ

1 голос
/ 17 июня 2020

Похоже, scrapData - это функция обещания, учитывая, что ей потребуется некоторое время для обработки данных с URL-адреса. В этом случае функция должна быть , затем -able и, предполагая, что она вернет данные после разрешения функции, вы можете получить фактический код из этого:

exports.createDataWithUrl = (req, res, next) => {
  let url = req.params.url;

  // assuming scrapData returns a promise
  exportDataCtrl.scrapData(url).then((data) => {
    const post = new Post({ data });

    post
      .save()
      .then((post) => res.status(201).json({ message: "success !" }))
      .catch((error) => res.status(400).json({ error: error }));
  });
};

EDIT: Вот как функция scrapData будет выглядеть как обещание (cheerio было добавлено в соответствии с комментарием)

// assumes you have fetch & cheerio
function scrapData(url) {
  return new Promise(function (resolve, reject) {
    fetch(url)
      .then((res) => res.text())
      .then((body) => {
        const $ = cheerio.load(body);

        // do scrape here, example gets title
        const data = $("title").text();
        resolve(data);
      })
      .catch((error) => reject(error));
  });
}
...