【发布时间】:2021-08-31 21:46:45
【问题描述】:
在调用一个 POST 请求后,我试图从 1 个响应正文中获取响应正文(并且我成功了),然后我想将它也保存到 MongoDB。但问题是它实际上并没有保存它(可能是因为 Mongoose),它没有占用想要的身体,只是保存了“ID”。
这里是控制器(装饰器@Post('scrape/:id'))
import { Body, Controller, Get, Post, Param, Res } from '@nestjs/common';
import { CreateBooleanStringDto } from '../dto/handles/create-boolean.dto';
import { CreateRawHandlesDto } from '../dto/handles/createRawHandlesDto';
import { HandlesService } from './handles.service';
import { BooleanString } from './interfaces/booleanString.interface';
import { RawHandles } from './interfaces/rawHandles.interface';
@Controller('booleans')
export class HandlesController {
constructor(private readonly handlesService: HandlesService) {}
@Get()
async findAll(): Promise<BooleanString[]> {
return await this.handlesService.findAll();
}
@Get(':id')
async findOne(@Param('id') id): Promise<BooleanString> {
return await this.handlesService.findOne(id);
}
@Post()
create(@Body() createBooleanStringDto: CreateBooleanStringDto): Promise<BooleanString> {
return this.handlesService.create(createBooleanStringDto)
}
@Post('scrape/:id')
async getBoolean(@Param('id') id, @Body() createRawHandlesDto: CreateRawHandlesDto): Promise<CreateRawHandlesDto> {
let term = await this.handlesService.getBoolean(id);
let handles = await this.handlesService.scrapeHandles([term.value]);
await this.handlesService.saveRawHandles(handles)
return handles;
}
@Post('map/:id')
async mapWriteHandles(@Param('id') id){
let booleanObject = await this.handlesService.getBoolean(id);
console.log(booleanObject)
return await this.handlesService.mapWriteHandles('https://linkedin', booleanObject.groupName)
}
}
服务(方法 scrapeHandles 返回我需要在方法 saveRawHandles
中保存到 Mongo 的结果import { Injectable, Logger} from '@nestjs/common';
import { BooleanString } from './interfaces/booleanString.interface';
import { CreateRawHandlesDto } from '../dto/handles/createRawHandlesDto';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
import { writeFile, readFileSync } from 'fs';
import { RawHandles } from './interfaces/rawHandles.interface';
@Injectable()
export class HandlesService {
private readonly logger = new Logger(HandlesService.name);
constructor(
@InjectModel('BooleanString')
private readonly booleanStringModel: Model<BooleanString>,
@InjectModel('RawHandles')
private readonly rawHandlesModel: Model<RawHandles>
) {}
async findAll(): Promise<BooleanString[]> {
return await this.booleanStringModel.find();
}
async findOne(id: string): Promise<BooleanString> {
return await this.booleanStringModel.findOne({ _id: id });
}
async create(booleanString: BooleanString): Promise<BooleanString> {
const newBoolean = new this.booleanStringModel(booleanString);
return await newBoolean.save();
}
async getBoolean(id: string): Promise<BooleanString> {
const booleanObject = await this.booleanStringModel.findOne({ _id: id });
const booleanStringValue = booleanObject.value;
return await this.booleanStringModel.findOne({ _id: id });
}
async scrapeHandles(booleanString): Promise<any> {
const se_scraper = require('se-scraper'); //
const scrape_job = {
search_engine: 'bing',
keywords: booleanString,
num_pages: 50,
};
const results = await se_scraper.scrape({}, scrape_job);
this.logger.log('Puppeter finished scraping handles from Bing')
return results;
}
async saveRawHandles(createRawHandlesDto: CreateRawHandlesDto): Promise<RawHandles> {
const createdRawHandles = new this.rawHandlesModel(createRawHandlesDto);
const dupa = new this.rawHandlesModel
return createdRawHandles.save();
}
async mapWriteHandles(uriToReplace, groupName): Promise<any> {
const fileToMap = require('../output/rawHandlesFromBing.json');
const handles = [];
const mapHandles = (uriToReplace) => {
const scrapedProspect = fileToMap.results.results;
Object.keys(scrapedProspect).forEach((key) => {
const resultPage = scrapedProspect[key];
Object.keys(resultPage).forEach((key) => {
const results = resultPage[key].results;
results.forEach((x) => {
const link = x.link.replace(uriToReplace, '');
handles.push(link);
});
});
});
};
const writeHandlesToFile = (groupName) => {
const obj = { groupName, handles };
const jsonOutput = JSON.stringify(obj);
console.log(obj);
writeFile('handles.json', jsonOutput, (err) => {
if (err) console.log(err);
else console.log('success');
});
};
const main = (uriToReplace, groupName) => {
mapHandles(uriToReplace);
writeHandlesToFile(groupName);
};
}
}
rawHandles 接口
export interface RawHandles {
id?: string,
booleanID: string,
results: any
}
rawHandles DTO
export class CreateRawHandlesDto {
readonly booleanID: string;
readonly results: any;
}
我想在 Mongo 中保存到 rawHandles 中的示例 JSON 对象(results)
{
"results": {
"Backend AND Python developer": {
"1": {
"num_results": "Wyniki: 7 000 000",
"no_results": false,
"effective_query": "",
"results": [
{
"link": "https://www.pythonistaplanet.com/how-to-become-a-python-backend-developer/#:~:text=To%20become%20a%20Python%20backend%20developer%2C%20first%20of,to%20have%20a%20basic%20understanding%20of%20front-end%20technologies.",
"title": "How To Become A Python Back-End Developer – Pythonista Planet",
"snippet": "",
"visible_link": "",
"rank": 1
},
{
"link": "https://code-maven.com/backend-python-developer",
"title": "Backend Python developer - Junior Python …",
"snippet": "11.03.2020 · A large subset of backend developers write web applications. They need to know the appropriate web framework used at their company. There are many Python-based web frameworks, but the most popular ones are Django and Flask. Learn at least one of them to increase your chances to become a good backend developer. Hint: Flask is much easire to learn.",
"visible_link": "https://code-maven.com/backend-python-developer",
"rank": 2
},
"metadata": {
"scraping_detected": false,
"elapsed_time": "16289",
"ms_per_keyword": "325.78",
"num_requests": 50
}
}
编辑:
我一直在尝试做一些不同的事情,但仍然没有成功,我不知道如何将其传递给 saveRawHandles() 方法并使用 Mongoose 将其保存到 Mongo。这是控制器和服务的最新代码 控制者:
@Post('scrape/:id')
async getBoolean(@Param('id') id, @Body() createRawHandlesDto: CreateRawHandlesDto): Promise<CreateRawHandlesDto> {
let term = await this.handlesService.getBoolean(id);
let handles = await this.handlesService.scrapeHandles([term.value]);
let rawHandles = {
booleanID: term.id,
results: handles
}
console.log(rawHandles)
await this.handlesService.saveRawHandles(rawHandles)
return handles;
}
console.log (json 对象 rawHandles)
{
booleanID: '60c8c4a481c9af67bf6c874a',
results: {
results: { 'Backend AND Python developer': [Object] },
metadata: {
scraping_detected: false,
elapsed_time: '15934',
ms_per_keyword: '318.68',
num_requests: 50
}
}
服务
async saveRawHandles(createRawHandlesDto: CreateRawHandlesDto): Promise<RawHandles> {
const createdRawHandles = new this.rawHandlesModel(createRawHandlesDto);
return createdRawHandles.save();
}
这是云中 Mongodb 的屏幕截图,基本上它只是添加新对象,但不是按照架构 MongoDB CLoud screenshoot
【问题讨论】: