gpt4 book ai didi

javascript - 使用 Express.js 从变量发送 POST 响应

转载 作者:行者123 更新时间:2023-11-29 20:56:14 24 4
gpt4 key购买 nike

我正在尝试列出发送 POST 请求的文件,但我不知道我在做什么有什么问题。这是我的功能:

app.post('/api/list', function(req,res){
listFiles();
res.send(files);
});

这是我的 listFiles 函数和测试变量:

var files = "";
var listFiles = function(){
fs.readdir(testFolder, (err, files) => {
files.forEach(file => {
files += file;
});
console.log(files);
})
};

我可以看到带有 console.log 输出的路径。但是,当我在 POST 中使用 res.send(files); 时,文件没有显示 - 它是空的。这是我用 jQuery 编写的用于显示文件的内容:

$('li').on('click', function(){
var item = $(this).text().replace(/ /g, "-");
$.ajax({
type: 'POST',
url: '/api/list',
success: function(data){
//do something with the data via front-end framework

alert('response : ' + data);
//location.reload();
}
});
});

如果我发送 res.send("test");,我的连接没有问题。我可以将该警报消息作为 "response : test"。但是当我尝试发送一个变量时,它是空的。

最佳答案

欢迎使用异步编程! :)

fs.readdir异步工作,所以当你调用 listFiles() , 立即返回并继续下一行 - res.send(files) .那一刻files really 仍然是一个空字符串,所以这就是您所看到的。

fs.readdir的回调实际上执行之后 res.send(files)完成,所以你要么需要执行 res.send()在同一fs.readdir回调,或使用 Promises 控制流程。

这里有几个例子:

  1. 通过 res列出文件,执行res.send()获得所需的输出后

    var listFiles = function (res) {
    fs.readdir(..., (err, files) => {
    var filesString = "";
    files.forEach(...)
    res.send(filesString)
    })
    };<br/>
    app.post('/api/list', function(req,res){
    listFiles(res);
    });

  2. 将回调传递给 listFiles,类似于第一个回调但遵循相同的模式 fs.readdir使用

    var listFiles = function (callback) {
    fs.readdir(..., (err, files) => {
    var filesString = "";
    files.forEach(...)
    callback(filesString)
    })
    };<br/>
    app.post('/api/list', function(req,res){
    listFiles((filesString) => res.send(filesString));
    });

  3. 换行fs.readdir在 Promise 中(您也可以为此使用 util.promisify,查看 Node docs )

    var listFiles = new Promise((resolve, reject) => {
    fs.readdir(..., (err, files) => {
    var filesString = "";
    files.forEach(...)
    return resolve(filesString)
    })
    })<br/>
    app.post('/api/list', function(req,res){
    listFiles().then((filesString) => res.send(filesString))
    // or, even better as Express can reply with a Promise directly
    // res.send(listFiles())
    });

有一个关于 NodeJS、异步编程和事件循环的不错的系列,我建议您继续阅读它,以便了解全局:https://jsblog.insiderattack.net/event-loop-and-the-big-picture-nodejs-event-loop-part-1-1cb67a182810 .另外,查看与 async/await 相关的内容,在大多数情况下,它使 Promises 更好用。

关于javascript - 使用 Express.js 从变量发送 POST 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49226905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com