在node.js可读流的res.body中发送JSON

时间:2019-06-13 17:45:40

标签: node.js json http stream request

我有一个api,它通过管道在节点中读取可读流响应的方式返回文件。我还想在响应中返回tokenBody的JSON内容,但是在构造流响应时我不知道要在哪里插入JSON。我在响应中得到文件就好了。记录请求时,我无法看到正确的JSON数据。它位于tokenBody的本地变量中。有什么建议么?设置res.body = tokenBody是我的想法,但会产生res.body is not a function错误。

更新 我可以使用res.json(tokenBody);返回JSON,但是node抛出cant set headers after they are sent错误,并且不再仅在JSON中提供响应文件。好像我只能做另一件事。有办法做到这两者吗?

app.get('/:token', function(req, res, next) {
  // first need to check whether user's allowed to have access to this token
  checkAllowedManageTokens(req.apiUserId, 'read')
  .then(function(constraints) {
    var query = queryPushAndCondition({token: req.params.token}, constraints);
    return tokenModel.findOne(query);
  })
  .then(function(obj){
    if (isDefined(obj)) {
      var tokenBody = objToJSON(obj);
      // Retrieve the file and send it back to the user
      var gfs = Grid(tokenDB.getConnection().db, tokenDB.getDriver());
      var readStream = gfs.createReadStream({filename:obj.filename});
      console.log("Token Body Response " + JSON.stringify(tokenBody));
      // Set response headers
      res.status(200);
      if (isDefined(obj.mimeType)) res.contentType(obj.mimeType);
      // Pipe the response data
      readStream.pipe(res);
    } else {
      clientError(res, "Not found");
    }
  })
  .catch(function(err){
    console.error('Token GET error: '+err.message);
    serverError(res, 'err.message');
  });
});

0 个答案:

没有答案