节点静态文件服务器,如何使响应在异步回调中起作用?

时间:2018-10-15 01:05:58

标签: node.js http response

我编写了此函数,当我在节点服务器上收到请求时触发该函数,该函数运行良好,并发回一个文件,该文件自动开始下载。

function(req, res) {
  // … other code …

  try {
    const fileContent = fs.readFileSync(fullPath, 'utf-8');

    res.writeHead(200, {
      'Content-Type': 'text/plain',
      'Content-Disposition': `attachment; filename="${fileName}"`,
    });
    res.end(fileContent);
  } catch (err) {
    res.writeHead(404);
    res.end();
  }
}

现在,我想使用readFile方法重写它,所以我尝试了类似的方法:

function(req, res) {
  // … other code …

  fs.readFile(fullPath, 'utf-8', function(err, data) {
    if (err) {
      res.writeHead(404);
      res.end();
      return;
    }

    res.writeHead(200, {
      'Content-Type': 'text/plain',
      'Content-Disposition': `attachment; filename="${fileName}"`,
    });
    res.end(data);
  });
}

但是现在它总是返回404错误,我认为函数在响应准备好之前就退出了,因此它会丢弃发生太晚的响应?我该如何运作?

请不要建议使用第三方库,因为这不是我要的。我只想使用本机模块。

谢谢。

  

使用节点10.7.0

1 个答案:

答案 0 :(得分:0)

问题实际上在代码的前面,我只是忘了在if语句中返回:

<link rel="stylesheet" href="https://unpkg.com/bootstrap@3.3.7/dist/css/bootstrap.min.css">
<div
  ng-app="app"
  ng-controller="ctrl">
  <select
    ng-model="pick"
    class="form-control">
    <option ng-value="cnames">NAME</option>
    <option ng-value="caddress">Address</option>
    <option ng-value="cpostal">PostalCode</option>
  </select>
  <input
    type="text"
    class="form-control"
    ng-model="selected"
    uib-typeahead="cname for cname in pick | filter:$viewValue | limitTo:5">
</div>
<script src="https://unpkg.com/angular@1.7.5/angular.min.js"></script>
<script src="https://unpkg.com/angular-ui-bootstrap@2.5.6/dist/ui-bootstrap-tpls.js"></script>

感谢@Paul让我思考并意识到了错误。