Я пытаюсь создать сборку, используя gulp , в которой также используется crawler . Во время сборки я использую функцию var {promisify} = require("util")
, чтобы использовать fs.writeFile
обещанным образом, чтобы я мог получить значение.
Данные регистрируются, но в конечном итоге я хотел бы записать данные в файл!
Вот настройка сканера.
const { src, watch, series, parallel, dest } = require('gulp');
var Crawler = require("crawler");
function iterObj(nestedObj) {
// keep a list of object references to prevent circular references at any level
let objReferences = [];
function rHelper(obj) {
let arr = []
let objValues = Object.values(obj);
// use var to avoid additonal heap overhead of new variable for each iteration
for (var i = 0; i < objValues.length; i++) {
let val = objValues[i];
// check if non null and not a reference we've already seen before (AKA circular reference)
if (val !== null && objReferences.indexOf(val) === -1) {
if (val.src) { arr.push({ src: val.src }) }
if (typeof val === "object" && !Array.isArray(val)) {
// since we're checking this object, add reference to list to make sure it doesn't get
// referenced by any of its children or siblings
objReferences.push(val);
arr.push(...rHelper(val));
}
}
}
return arr;
}
return rHelper(nestedObj);
}
var c = new Crawler({
maxConnections: 10,
// This will be called for each crawled page
callback: function(error, res, done) {
if (error) {
console.log(error);
} else {
var $ = res.$;
// $ is Cheerio by default
//a lean implementation of core jQuery designed specifically for the server;
var img = $(`img`);
// add circular references for testing
img[0].attribs.self = img[0].attribs;
img[0].attribs.parent = img[0];
img[0].attribs.top = img;
img[0].next.prev = img[0].prev;
img[0].prev.next = img[0].next;
let data = JSON.stringify(iterObj(img));
console.log("data in crawler ", data);
console.log("typeof img === 'object' && !Array.isArray(img)", typeof img === "object" && !Array.isArray(img))
return data;
}
done();
}
});
module.exports = c
И это мой файл gulp:
var { src, dest, watch, series, parallel } = require('gulp');
var crawler = require('./src/crawler');
var toJSON = require('gulp-js-to-json');
var fs = require('fs');
const { promisify } = require("util");
const writeFile = promisify(fs.writeFile);
var files = {
getJs: `src/js/**/*.js`,
getJSON: `src/json/**/*.json`,
toJsPath: `src/js/`,
jsonPath: `src/json/`
}
// fetch command line arguments
const arg = (argList => {
let arg = {},
a, opt, thisOpt, curOpt;
for (a = 0; a < argList.length; a++) {
thisOpt = argList[a].trim();
opt = thisOpt.replace(/^\-+/, '');
if (opt === thisOpt) {
// argument value
if (curOpt) arg[curOpt] = opt;
curOpt = null;
} else {
// argument name
curOpt = opt;
arg[curOpt] = true;
}
}
return arg;
})(process.argv);
async function writeJS() {
var data = crawlerTask();
await writeFile(`${files.toJsPath}/${arg.name}.js`, data);
}
function crawlerTask() {
return crawler.queue(arg.url)
}
function jsToJSON() {
return src(`${files.toJsPath}/${arg.name}.js`)
.pipe(toJSON({
stringify: {
space: '\t'
}
}))
.pipe(dest(`${arg.name}`))
}
function runCrawler() {
return writeJS().catch(error => console.error(error))
}
exports.runCrawler = runCrawler
Но то, что я получаю обратно в
созданный файл .js
, является значением undefined
.
Кто-нибудь может помочь?