【问题标题】:How can I get a group of XML files from a ftp server in Typescript?如何从 Typescript 中的 ftp 服务器获取一组 XML 文件?
【发布时间】:2023-02-16 19:47:00
【问题描述】:

我尝试使用 ftp 节点模块从 ftp 服务器加载一组 XML 文件。

它不起作用,所以我需要。没有实现异步/等待。集成良好的可读代码是不好的。

有没有更好的办法?

我的错误代码是(它可以工作,但是这个异步人员很困惑!):

import Client from 'ftp';
import ReadableStream = NodeJS.ReadableStream;

const c = new Client();

function streamToString(stream: ReadableStream) {
    // lets have a ReadableStream as a stream variable
    const chunks = [];

    for await (const chunk of stream) {
        chunks.push(Buffer.from(chunk));
    }

    return Buffer.concat(chunks).toString("utf-8");
}
const getFile = async () => {
    let fname: string = ""

    c.on('ready', () => {
        c.list(".", async (err, list) => {
            if (err) throw err;
            // console.dir(list);
            for (const fileProp of list) {
                console.log("fileProp: " , './' +fileProp.name)
                fname = fileProp.name

                if(fileProp.name.match(/.*\.xml/)){

                     c.get('./' + fileProp.name,  (err, stream) => {
                        if (err) throw err;
                        console.log("fname: " + fname)
                        const result =  streamToString(stream)

                        console.log("file content:\n" + result)
                        return
                    });
                }
            }

            c.end();
        });
    });
    c.on('error', () => {
        console.log('handle error');
    });

    await c.connect({
        host: "myserver.com",
        user: "myuser",
        password: "mypassword",
        //debug: m => console.log(m)
    })

}

【问题讨论】:

    标签: typescript ftp


    【解决方案1】:

    更好的方法是使用basic-ftp 模块。 ftp 模块很旧,没有实现 async/await 特性。

    因此,使用 basic-ftp,您可以实施一个清晰直接的解决方案 - 简单且可读性好。

    import * as streamBuffers from "stream-buffers"
    import ftp,{FileInfo} from "basic-ftp";
    
    const testFtp = async () => {
        await baseFtpTest()
        console.log("end testFtp")
    }
    
    const baseFtpTest = async () => {
        const client = new ftp.Client()
        client.ftp.verbose = true
        try {
            await client.access({
                host: "myserver.com",
                user: "myuser",
                password: "mypassword",
                //secure: true
            })
    
            console.log(await client.list())
            let flist: FileInfo[] = await client.list()
    
            for (const fileProp of flist) {
                if(fileProp.name.match(/.*.xml/)) {
                    console.log("fname: " + fileProp.name)
                    let sbuff: streamBuffers.WritableStreamBuffer = new streamBuffers.WritableStreamBuffer()
                    await client.downloadTo(sbuff, fileProp.name)
                    let content: string | false = sbuff.getContentsAsString()
                    console.log("content:", content)
                }
            }
        }
        catch(err) {
            console.log(err)
        }
        client.close()
    }
    
    debugger
    
    testFtp()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多