这是在node.js中编写asynchronous代码的正确方法吗?

我正在尝试让一些node.js代码弄脏我的手。 我理解事件和callback以及asynchronous技术的理论,但这并不意味着以“正确的方式”真正地生成代码是很容易的。

以下是我的(reallife)中间件的例子。 一个简单的HTTP服务器侦听请求并进行/get ,它会查询我们的后端,并将数据从那里提交给客户端。

 var http = require('http') var https = require('https') var url = require('url') var backendOptions = { port: 1414, hostname: 'data.backend.com', path: '/bulk', auth: 'user:$ecret' } var backendGet = function(callback) { https.get(backendOptions, function(res) { var content = '' res.on('data', function(chunk) { content += chunk }) res.on('end', function() { callback(content) }) }) } var server = http.createServer(function(req, res) { switch(url.parse(req.url).pathname) { case '/get': backendGet(function(content) { res.writeHead(200, {'Content-Type': 'text/plain'}) res.write(content) res.end() }) break default: res.writeHead(200, {'Content-Type': 'text/html'}) res.write('<p>It works!</p>') res.end() } }).listen(8080, 'localhost') 

这段代码的工作原理 – 但是我怎么在node.js中编写代码呢? 当后端数据可用时,客户端应该被提供服务,所以我只要没有更多的后端数据被读取,就调用backendGet()函数作为callback来操作res对象。

一般的评论和批评也是受欢迎的!

亚历克斯

这看起来很稳固。 我会做一些调整,最大的是,callback有传统的函数签名function callback(err, result1, result2..) 。 如果它工作的话,你可以调用callback(null, content)如果没有,则callback('Problem')或者callback(new Error('Problem'))

我使用上述惯例添加了error handling。 AFAIK没有尾随分号不会破坏任何东西,但我join了它们的习惯的力量。 我把处理请求的匿名函数转移到它自己的函数中,使其更清晰。 最后我重新调整到2个空格,因为它让callback更加易于pipe理。

 var http = require('http'); var https = require('https'); var url = require('url'); var backendOptions = { port: 1414, hostname: 'data.backend.com', path: '/bulk', auth: 'user:$ecret' }; var backendGet = function(callback) { https.get(backendOptions, function(res) { var content = ''; res.on('data', function(chunk) { content += chunk; }); res.on('end', function() { callback(null, content); }); res.on('error', function(err) { // i didn't look up this syntax but I think this is how errors are signified console.log('Request error: '+err); callback('Request error'); }); }); }; function handler(req, res){ switch(url.parse(req.url).pathname) { case '/get': backendGet(function(err, content) { if(err){ res.writeHead(500, {'Content-Type': 'text/plain'}); res.write('Request error'); return res.end(); }; res.writeHead(200, {'Content-Type': 'text/plain'}); res.write(content); res.end(); }) break; default: res.writeHead(200, {'Content-Type': 'text/html'}); res.write('<p>It works!</p>'); res.end(); } }; var server = http.createServer(handler).listen(8080, 'localhost');