node.js在其他函数内的异步调用
我有一些非常愚蠢的问题,我正试图根据从mongodb中提取的条件使用node.js创建重定向服务。。。所以代码看起来是这样的:node.js在其他函数内的异步调用,node.js,redirect,asynchronous,Node.js,Redirect,Asynchronous,我有一些非常愚蠢的问题,我正试图根据从mongodb中提取的条件使用node.js创建重定向服务。。。所以代码看起来是这样的: var http = require('http'), util = require('util'), url = require('url'); var server = http.createServer(function(req, res) { domain = req.headers['host']; var url = getRedirect
var http = require('http'),
util = require('util'),
url = require('url');
var server = http.createServer(function(req, res) {
domain = req.headers['host'];
var url = getRedirect(domain);
res.writeHead(301, { 'Location': url});
res.end();
});
server.listen(8080);
var getRedirect = function(domain) {
Domain.findOne({ 'name': domain }, 'url', function (err, domain) {
if (err) return handleError(err);
console.log('redirect url %s.', domain.url)
return domain.url
})
}
当然-不能正常工作,因为Domain.findOne会延迟查找结果,return不会将结果分配给url。。。我试图将“res”对象传递到getRedirect函数中,但我很确定这是错误的
有什么线索吗 您需要为此使用回调,因为(正如您所指出的)域/url获取是异步的。节点约定使用“错误优先回调”签名 试试这个:
var http = require('http'),
util = require('util'),
url = require('url');
var server = http.createServer(function(req, res) {
var domain = req.headers['host'];
// provide a callback to getRedirect so we can get the value asynchronously
getRedirect(domain, function(err, url) {
if (err) return handleError(err);
res.writeHead(301, { 'Location': url });
res.end();
});
});
server.listen(8080);
var getRedirect = function(domain, cb) {
Domain.findOne({ 'name': domain }, 'url', function (err, domain) {
if (err) return cb(err);
console.log('redirect url %s.', domain.url);
// instead of returning, pass the result to the callback
cb(null, domain.url);
});
};
我用过,但你的解决方案看起来更好
async.series([
function (callback) {
Domain.findOne({ 'name': domain }, 'url', function (err, domain) {
if (err) return handleError(err);
console.log('looking for domain' + domain);
callback(null, domain.url);
})
}
], function (err, results) {
res.writeHead(301, { 'Location': results[0]});
res.end();
});