等待处理结束,然后再将其保存到数据库 [求解]



我使用Express JS和Node JS来构建REST API

我想用cheerio构建一个json对象,然后将其添加到我的mongoDB数据库中。

根据承诺是一个实用的解决方案,但我仍然无法在 JavaScript 中创建承诺。

我做了这个测试代码

我创建了一个具有此功能的控制器,它将使用 cherrio 分析一个 url。

url 参数是从我的 API 的邮政路由传输的

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

另一个控制器的此功能检索数据并将其保存在数据库中。

const Post = require('../models/Post');
const exportDataCtrl = require('./exportData');
exports.createDataWithUrl = (req, res, next) => {
let url = req.params.url;
const dataScrape = exportDataCtrl.scrapeData(url);
const post = new Post({
...dataScrape
})
post.save()
.then(post => res.status(201).json({ message:'success !'}))
.catch(error => res.status(400).json({ error:error })) 
}

编辑:添加Post.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);

我试图使用抓取数据函数和 mongoDB 的函数保存创建一个承诺,但我仍然得到该函数然后返回一个未定义的结果。

我想我不太明白这些承诺,错误一定是显而易见的。

提前感谢您的帮助和回答。

看起来 scrapeData 是一个承诺函数,因为它需要一些时间来处理来自 url 的数据。在这种情况下,该函数应该是可以的,并且假设它将在解析函数后返回数据,您可以从中派生实际代码:

exports.createDataWithUrl = (req, res, next) => {
let url = req.params.url;
// assuming scrapeData returns a promise
exportDataCtrl.scrapeData(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 }));
});
};

编辑:这是刮板数据功能的外观(根据评论添加了cheerio(

// assumes you have fetch & cheerio
function scrapeData(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));
});
}

最新更新