这是我使用的程序,但原始帮助来自T.J
我通过改变我的机械装置解决了我的问题。我采取了以下步骤来解决我的问题:
- 我保存了一个JSON文件,而不是之前通过js文件导出的数组。
- 然后在
.get()
API中,我从fs.readFileSync()
读取该文件,并通过JSON.parse()
解析它,然后以JSON格式返回数组。
代码如下:Arrays/bookFiles.json
:
{
"name":"bookFiles",
"array":[["CSSNotesForProfessionals.pdf","/mnt/Data/Books/CSSNotesForProfessionals.pdf","pdf","application/pdf"],["JS for Beginners.pdf","/mnt/Data/Books/JS for Beginners.pdf","pdf","application/pdf"],["alqamoosulwaheed.pdf","/mnt/Data/Books/alqamoosulwaheed.pdf","pdf","application/pdf"]]
}
routes/book.mjs
:
import express from "express";
import * as fs from 'fs'
export const book = express.Router();
// import { bookFiles } from "../Arrays/bookFiles.mjs";
book.get("/",(req,res)=>{
const data = JSON.parse(fs.readFileSync('/home/abdurehman/LocalNas/backend/Arrays/bookFiles.json','utf-8'))
res.send(data.array)
}
)
上一期:
下面是我的数组,它在一段时间后被另一个脚本更改
export const bookFiles=[]
我已经将其导入到我的主Express JS + Node JSroute中,用于API,但问题是,当我运行脚本时,它会获取并 * 记住 * 数组中的值,并将其提供给API fetch,但我希望它重新导入或重新扫描数组并将其发送给API fetch。
工艺路线文件:routes/book.mjs:
import express from "express";
export const book = express.Router();
import { bookFiles } from "../Arrays/bookFiles.mjs";
book.get("/",(req,res)=>{
const data=bookFiles
res.send(data)
}
)
这是我的主文件/app.mjs:
import express from 'express';
import { zip } from './routes/zip.mjs';
import { office } from './routes/office.mjs';
import { compressed } from './routes/compressed.mjs';
import { image } from './routes/images.mjs';
import { book } from './routes/book.mjs';
import { videos } from './routes/videos.mjs';
var app = express()
app.use("/zipFiles",zip)
app.use("/officeFiles",office)
app.use("/videoFiles",videos)
app.use("/compressedFiles",compressed)
app.use("/bookFiles",book)
app.use("/imageFiles",image)
app.listen("5000")
我还尝试从.js文件读取FileSync,然后将其解析为Array,但它不起作用,因为JSON.parse()不支持它。谢谢合作。
下面是修改Arrays/*
文本的代码:/fmgr.mjs
:
import * as fs from 'fs';
import {fileTypeFromFile} from 'file-type';
import * as path from 'path';
import * as url from 'url';
var compressedFiles = [];
var imageFiles = [];
var videoFiles = [];
var undefinedFiles = [];
var bookFiles = [];
var zipFiles = [];
var officeFiles = [];
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
async function chaosofFiles() {
const getAllFiles = function (dirPath, arrayOfFiles) {
const files = fs.readdirSync(dirPath)
arrayOfFiles = arrayOfFiles || []
files.forEach(function (file) {
if (fs.statSync(dirPath + "/" + file).isDirectory()) {
arrayOfFiles = getAllFiles(dirPath + "/" + file, arrayOfFiles)
} else {
arrayOfFiles.push(path.join(dirPath, "/", file))
}
})
// console.log(arrayOfFiles)
return arrayOfFiles
}
const myFiles = [];
getAllFiles("/mnt/Data", myFiles)
// const files_with_type = [];
// const type = await fileTypeFromFile(myFiles.at(0))
// console.log(type)
// // Determing the type of files
const filesextensions = await Promise.all(myFiles.map(async (file) => {
const type = await fileTypeFromFile(file);
const name = file.split('\\').pop().split('/').pop();
let array = [];
if (type == undefined) {
array = [name, file, "undefined", "undefined"]
} else {
array = [name, file, type.ext, type.mime];
}
// const files_with_type
return array;
// console.log(filesextensions)
})
)
// console.log(files_with_type)
console.log("This it the final\n")
// console.log(filesextensions);
compressedFiles = [];
imageFiles = [];
videoFiles = [];
undefinedFiles = [];
bookFiles = [];
zipFiles = [];
officeFiles = [];
filesextensions.forEach(function (array) {
const mime = array.at(3);
// console.log('Cureent '+{mime})
// console.log('Array \n '+{array})
const ext = array.at(2);
// console.log('Cureent '+{ext})
if (ext.includes("zip")) {
zipFiles.push(array)
} else if (mime.includes("image")) {
imageFiles.push(array)
} else if (mime.includes("compressed")) {
compressedFiles.push(array)
} else if (mime.includes("video")) {
videoFiles.push(array)
} else if (mime == "undefined") {
undefinedFiles.push(array)
} else if (mime.includes("office")) {
officeFiles.push(array)
}
else if (mime.includes("pdf")) {
bookFiles.push(array)
}
}
)
// console.log({zipFiles})
// console.log({compressedFiles})
// console.log({officeFiles})
// console.log({videoFiles})
const arrayGroup = [
{ name: "compressedFiles", array: compressedFiles },
{ name: "imageFiles", array: imageFiles },
{ name: "videoFiles", array: videoFiles },
{ name: "zipFiles", array: zipFiles },
{ name: "officeFiles", array: officeFiles },
{ name: "bookFiles", array: bookFiles },
{ name: "undefinedFiles", array: undefinedFiles }
]
// console.log("Current dir is ",__dirname)
arrayGroup.forEach(
function (array) {
console.log(array)
fs.writeFile(__dirname + "Arrays/" + array.name + ".mjs", "export const " + array.name + "= ()=>{ return " + JSON.stringify(array.array)+";}", function (err) {
if (err) {
return console.log(err);
}
});
}
)
}
chaosofFiles()
async function waitUntil() {
return await new Promise(resolve => {
var i = 0;
const interval = setInterval(() => {
resolve('foo');
chaosofFiles()
i = i + 1;
}, 10000);
});
}
waitUntil()
2条答案
按热度按时间rjee0c151#
你为什么不使用express.static middleware?
如果有理由读取文件,然后处理它,那么将这些文件存储为
.json
会更好。假设你不想使用静态文件...
您已经在
fs.writeFile
调用中使用了JSON.stringify
,为什么不直接使用用途:13z8s7eq2#
我 * 认为 * 你是说,当你的web服务器进程运行时,你有另一个进程定期替换
../Arrays/bookFiles.mjs
文件,你想看到这些变化。JavaScript模块不以这种方式工作。在程序执行期间,模块被读取 * 一次 *。
如果你想在每次请求时重新读取文件(或者当它发生变化时),不要将它设置为模块。相反,让它成为一个你需要重写的JSON文件,让你的Web进程在启动或更改时读取和解析JSON文件。您可以导出一个函数,该函数将获取数组,缓存它并记住文件日期/时间,并在文件日期/时间未更改时重用数组,但在更改时重新读取它。然后在路由处理程序中调用返回数组的函数。