关于javascript:Sails.js:在我要发送实际响应之前已发送200个响应

Sails.js: 200 response is sent before I want to send actual response

使用Sails.js 1.2.3,我试图通过HTTP或WebSockets从文件发送一些数据作为对GET请求的响应。无论我是在控制器中同步访问还是异步访问文件,Sails都会在发送实际所需的响应之前发送200 OK响应。最初,我尝试将文件传输到响应,但未成功:

1
2
3
4
5
6
7
8
9
10
fn: async function() {
    var fs = require("fs");
    let filename = `foo.bar`;
    let file = require("path").resolve(
      sails.config.appPath,
      `.tmp/${filename}`
    );
    let filestream = fs.createReadStream(file);
    filestream.pipe(this.res);
}

这样,我会收到"结束后写入"错误,并在此错误发生之前立即向客户端发送200 OK响应(无数据)。

如果我同步执行,例如:

1
2
3
4
5
6
7
8
     ...
      var offset = 0;
      var chunkSize = 2048;
      var chunkBuffer = new Buffer(chunkSize);

      var fd = fs.openSync(file,"r");
      var chunk = fs.readSync(fd, chunkBuffer, 0, chunkSize, offset);
      this.res.send(chunkBuffer);

...在我到达this.res.send()之前已发送200 OK响应(无数据)。在我可以在控制器中做任何有用的事情之前,必须有一些我不知道的自动响应处理,它会发送200 OK。在获取需要发送的数据后,直到我明确说出this.res.sendthis.res.end时,我才如何不发送任何响应?谢谢!


因为这是异步功能,所以您必须添加await。如果您不添加等待,则将执行下一行,因为non-blocking

1
2
var fd = await fs.openSync(file,"r");
var chunk = await fs.readSync(fd, chunkBuffer, 0, chunkSize, offset);