【发布时间】:2021-12-07 04:38:59
【问题描述】:
我正在创建一个简单的节点应用程序。我想要达到的目标:
我的应用程序将网页链接和一些关键字作为输入。现在我想根据输入的关键字创建新的网页。所以如果我进入优秀的程序员,优秀的问题解决者,nodejs 开发者。它应该创建 3 个新文件 good_programmer.php、great_problem_solver.php。 nodejs_developer.php 然后我想下载这些文件。
我对这个问题的建议解决方案如下:
const fs = require("fs");
const path = require("path");
const axios = require("axios");
const cheerio = require("cheerio");
const zipadm = require("adm-zip");
const zip = new zipadm();
// initialize app
const app = express();
// to handle the forms
app.use(express.urlencoded({ extended: false }))
// initialize port
const PORT = 8000;
// util functions
function deletePreviousFiles() {
return new Promise((res, rej) => {
fs.readdir(__dirname, (err, files) => {
if (err) throw err;
for (const file of files) {
if (file.includes(".php") || file.includes("sitemap.txt") || file.includes(".zip")) {
fs.unlink(path.join(__dirname, file), err => {
if (err) throw err;
});
}
}
res();
})
})
}
function generateSitemapFile(webpage, words) {
return new Promise((res, rej) => {
let keywords = words.split(",");
for (let i = 0; i < keywords.length; i++) {
let fileName = keywords[i].trim().replace(" ", "_");
let newLink = `${webpage}${fileName}.php`;
fs.appendFile(`sitemap.txt`, `${newLink}\n`, function (err) {
if (err) throw err;
});
}
res();
})
}
function generatePHPFiles(data, words) {
return new Promise((res, rej) => {
const $ = data;
$.html();
let keywords = words.split(",");
for (let i = 0; i < keywords.length; i++) {
let fileName = keywords[i].trim().replace(" ", "_");
fs.writeFile(`${fileName}.php`, $.html(), (err) => {
if (err) throw err;
})
}
res();
})
}
function createZipFile() {
return new Promise((res, rej) => {
fs.readdir(__dirname, (err, files) => {
if (err) throw err;
for (const file of files) {
if (file.includes(".php") || file.includes("sitemap.txt")) {
zip.addFile(file);
data = zip.toBuffer();
zip.writeZip("NewPhpFiles.zip");
}
}
res();
})
})
}
// controller
const startApplication = async (req, res, next) => {
try {
const webPageLink = req.body.link;
const seoKeywords = req.body.keywords;
// delete previous files on desk
await deletePreviousFiles();
console.log("Previous Files Deleted...");
// generate sitemap.txt file
await generateSitemapFile(webPageLink, seoKeywords);
console.log("Sitemap Created...");
// get web page response
let response = await axios.get(webPageLink);
const data = await cheerio.load(response.data);
console.log("Data Loaded From Page...")
// create new php files
generatePHPFiles(data, seoKeywords);
console.log("PHP Files Created...")
// create a zip file
createZipFile();
console.log("ZIP Created...")
next();
} catch (error) {
console.log(error)
}
}
const downloadFile = async (req,res) => {
try {
setTimeout(()=>{
res.download("NewPhpFiles.zip");
},1000)
} catch (error) {
console.log(error)
}
}
app.use(startApplication)
// initialize the route for application
app.post("/submit", downloadFile)
// start app
app.listen(PORT, console.log(`App is listening on port: ${PORT}...`));
所以,我正在删除磁盘上现有的 php 文件,然后创建新文件并压缩它们,但它不会下载新文件。似乎创建新文件需要很长时间。
【问题讨论】:
标签: javascript node.js async-await promise settimeout