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

Javascript 使用Express.js从变量发送POST响应,javascript,jquery,node.js,express,Javascript,Jquery,Node.js,Express,我试图列出发送POST请求的文件,但我无法找出我所做的有什么问题。以下是我的功能: app.post('/api/list', function(req,res){ listFiles(); res.send(files); }); 这是我的listFiles函数和测试变量: var files = ""; var listFiles = function(){ fs.readdir(testFolder, (err, files) => { files.f

我试图列出发送
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);
  })
};
我可以通过
控制台.log
输出查看路径。但是,当我使用
res.send(文件)时
POST
中,文件没有显示-它是空的。以下是我在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(“测试”),我的连接正常。我可以将该警报消息设置为
“response:test”
。但是当我尝试发送一个变量时,它是空的。

欢迎使用异步编程!:)

fs.readdir
是异步工作的,因此当您调用
listFiles()
时,它会立即返回并转到下一行-
res.send(files)
。此时,
文件
实际上仍然是一个空字符串,所以这就是您看到的

fs.readdir
的回调实际上是在
res.send(files)
完成后执行的,因此您需要在相同的
fs.readdir
回调中执行
res.send()
,或者通过承诺控制流

以下是几个例子:

  • res
    传递给listFiles,在获得所需输出后执行
    res.send()

    var listFiles=函数(res){
    fs.readdir(…,(错误,文件)=>{
    var filestring=“”;
    files.forEach(…)
    res.send(文件字符串)
    })
    };
    app.post('/api/list',函数(req,res){ 列表文件(res); });

  • 将回调传递给listFiles,与第一个类似,但遵循相同的模式

    var listFiles=函数(回调){
    fs.readdir(…,(错误,文件)=>{
    var filestring=“”;
    files.forEach(…)
    回调(文件字符串)
    })
    };
    app.post('/api/list',函数(req,res){ listFiles((filestring)=>res.send(filestring)); });

  • fs.readdir
    包装在承诺中(您也可以使用
    util.promisify
    为此,请查看)

    var listFiles=新承诺((解决、拒绝)=>{
    fs.readdir(…,(错误,文件)=>{
    var filestring=“”;
    files.forEach(…)
    返回解析(文件字符串)
    })
    })
    app.post('/api/list',函数(req,res){ listFiles().then((filestring)=>res.send(filestring)) //或者,更妙的是,Express可以直接回复承诺 //res.send(listFiles()) });


  • 这里有一个关于NodeJS、异步编程和事件循环的系列文章,我建议您仔细阅读,这样您就可以了解全局了。另外,请查看与相关的内容,在大多数情况下,这会使承诺更易于使用。

    我实际上是javascript新手:)非常感谢您的详细解释。我一定会检查这个链接了。我尝试了第一个例子,效果非常好。我也会尝试第二次,这对我来说是一个很好的例子。再次感谢!我很乐意帮忙!这实际上是来自更传统或介绍性的语言(如C、Python或PHP)时要克服的最大障碍之一,在这些语言中,异步内容要么不存在,要么在类/教程中没有得到任何关注,因此只要您了解异步内容和节点的一些内部工作(例如事件循环),一切都会更容易推理。祝你好运!