我是IronRouter的新手,为什么执行readFile回调会将响应发送给客户端。
Router.map(
()->
this.route 'readFile',
path: '/readFile'
where: 'server'
method: 'GET'
action: ()->
self = this
fs.readFile '/tmp/a.txt', (err, data)->
if err
throw err
console.log(data.toString())
self.response.writeHead(200, {'Content-Type': 'text/plain'})
self.response.end(data)
console.log('response ...')
)
http.js:733
W2049-12:04:26.781(8)? (STDERR) throw new Error('Can\'t render headers after they are sent to the client.'
W2049-12:04:26.781(8)? (STDERR) ^
W2049-12:04:26.782(8)? (STDERR) Error: Can't render headers after they are sent to the client.
但是,我使用快递,这样做效果很好。
exports.index = function(req, res){
fs.readFile('/tmp/a.txt', function (err, data) {
if (err) throw err;
console.log(data.toString());
res.send(200, data.toString());
});
console.log('response ...');
};
感谢@ChristianF @Tarang使用Meteor._wrapAsync或Future一切正常。当我使用自定义函数替换fs.readFile时。它需要投掷前。我怀疑我定义的函数有错误。如下:
@getAccounts = (callback) ->
query = "SELECT Id, Name, AccountNumber FROM Account"
queryBySoql(query, (err, result)->
if err
return console.error(err)
return callback(result)
)
我调用了这个链接:
# using Meteor
#data = Meteor._wrapAsync(getAccounts)()
#using Future
waiter = Future.wrap(getAccounts)()
data = waiter.wait()
this.response.writeHead 200, {'Content-Type': 'text/plain'}
this.response.end JSON.stringify(data)
谢谢大家。
答案 0 :(得分:3)
就在今天,我一直在努力解决这个问题。在我看来,答案是流星(或至少是铁路由器)不能按照你期望的方式处理异步调用。解决方案是将异步调用包装到光纤中,这是meteor用于保持编程同步的机制。
在你的情况下试试这个(对不起,我不太了解coffeescript):
var Future = Npm.require('fibers/future');
...
var waiter = Future.wrap(fs.readFile);
var data = waiter('/tmp/a.txt').wait();
response.writeHead(200, {'Content-Type': 'text/plain'})
response.end(data)
编辑解决问题的补充问题。
将来包含的函数需要将回调作为具有(错误,结果)签名的最后一个参数。试试这个:
@getAccounts = (callback) ->
query = "SELECT Id, Name, AccountNumber FROM Account"
queryBySoql(query, (err, result)->
if err
return console.error(err)
return callback(err, result)
)
答案 1 :(得分:0)
您可以将读取文件请求的回调包装到同一光纤中。它不会阻止其他请求和出来很干净。
readFile = Meteor_wrapAsync(fs.readFile.bind(fs))
data = readFile("/tmp/a.txt")
console.log data
@response.writeHead(200, {'Content-Type': 'text/plain'})
@response.end data
return