【问题标题】:Sending POST response from a Variable using Express.js使用 Express.js 从变量发送 POST 响应
【发布时间】:2018-08-19 23:33:43
【问题描述】:

我正在尝试列出发送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"。但是当我尝试发送一个变量时,它是空的。

【问题讨论】:

    标签: javascript jquery node.js express


    【解决方案1】:

    欢迎来到异步编程! :)

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

    fs.readdir 的回调实际上是在 res.send(files) 完成后执行的,因此您需要在同一个 fs.readdir 回调中执行 res.send(),或者使用 Promises 控制流程。

    这里有几个例子:

    1. 将res 传递给listFiles,得到所需的输出后执行res.send()

      var listFiles = function (res) { fs.readdir(..., (err, files) => { var filesString = ""; files.forEach(...) res.send(filesString) }) };
      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) }) };
      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) }) })
      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 的新手 :) 非常感谢你这么详细的解释。我也一定会检查这个链接。我尝试了第一个示例,它工作得非常好。我也会尝试第二个,这对我来说将是一个很好的例子。再次感谢!
    • 我很乐意提供帮助!这实际上是来自更传统或介绍性语言(如 C、Python 或 PHP)时要克服的最大障碍之一,其中异步内容要么不存在,要么在课程/教程中没有受到任何关注,所以一旦你把头包起来围绕异步的东西和 Node 的一些内部工作(例如事件循环),一切都会更容易推理。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多