NodeJS 如何从.js文件导入新数组(导出数组)

yiytaume  于 2023-10-17  发布在  Node.js
关注(0)|答案(2)|浏览(145)

这是我使用的程序,但原始帮助来自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()
rjee0c15

rjee0c151#

你为什么不使用express.static middleware
如果有理由读取文件,然后处理它,那么将这些文件存储为.json会更好。
假设你不想使用静态文件...
您已经在fs.writeFile调用中使用了JSON.stringify,为什么不直接使用用途:

fs.writeFile(__dirname + "Arrays/" + array.name + ".json", JSON.stringify(array.array), function (err) {
13z8s7eq

13z8s7eq2#

我 * 认为 * 你是说,当你的web服务器进程运行时,你有另一个进程定期替换../Arrays/bookFiles.mjs文件,你想看到这些变化。
JavaScript模块不以这种方式工作。在程序执行期间,模块被读取 * 一次 *。
如果你想在每次请求时重新读取文件(或者当它发生变化时),不要将它设置为模块。相反,让它成为一个你需要重写的JSON文件,让你的Web进程在启动或更改时读取和解析JSON文件。您可以导出一个函数,该函数将获取数组,缓存它并记住文件日期/时间,并在文件日期/时间未更改时重用数组,但在更改时重新读取它。然后在路由处理程序中调用返回数组的函数。

相关问题