如何在ExpressJS中使用Q承诺?

问题描述:

我需要生成pdf文档。关于pdf进入generateDoc函数的所有魔法,它以Buffer数据作为参数返回承诺。但Express不会将数据发送到客户端,只有标头。我究竟做错了什么?如何在ExpressJS中使用Q承诺?

app.get('/', function(req, res) { 
     generateDoc().then(function(data) { 
      res.set({ 
       'Content-Type': 'application/pdf', 
       'Content-Length': data.length 
      }); 
      res.end(data); 
     }); 
    }); 

解决方案

如果你想从服务器返回的PDF,则必须使用binary参数有关res.end。

generateDoc().then(function(data) { 
    res.set({ 
     'Content-Type': 'application/pdf', 
     'Content-Length': data.length 
    }); 
    res.end(data, 'binary'); 
}).fail(function (error) { 
    res.end(500, "Some error"); 
}); 

尝试使用res.sendref):

app.get('/', function(req, res) { 
    generateDoc().then(function(data) { 
     ... 
     res.send(data); 
    }); 
}); 
+0

不错的尝试,但不起作用。 – NiLL

+0

@NiLL,有什么错误?数据不是空的,你确定?什么'generateDoc()。然后(函数(数据){console.log(参数)'show? – krasu

+0

只是空的正文,没有一个错误和正确的标题,但没有内容类型,数据句柄正确。 – NiLL

我用这个:

server.get('/item/:id', function (req, res, next) { 
    service.get(req.params.id). 
    done(res.json.bind(res), next); 
}); 

调用done方法来执行的承诺链。使用next回调函数作为错误处理程序,以便将错误发送到客户端!确保将json方法绑定到res对象以防止出现错误。