在这个例子中,使用快递,我想通过' res'所以我可以在功能完成时指导页面:
function dostuff(id) {
console.log(id);
};
app.post('/:id', function(req, res){
dostuff(req.params.id, function() {
res.redirect('/');
});
});
但是' res'不知道。所以我试图将它传递给函数参数:
dostuff(req.params.id, function(res) {
但这不起作用。如何正确地做到这一点?
修改
所以我似乎已经失去了将代码简化为示例的上下文。这是我的原始代码 - 请注意' res'正在传递,但生成的错误是res.redirect不是函数:
app.delete('/todo/:id', function(req, res){
var id = [req.params.id];
couch.view('items', 'all_items', {keys: id}, function(err, body, res) {
if (!err) {
var row = body.rows[0];
var id = row.id;
var rev = row.value.rev;
couch.destroy(id, rev);
res.redirect('/todo');
};
});
});
答案 0 :(得分:1)
当你将回调定义为function(err, body, res)
时,你期望couch.view
将res作为最后一个参数传递,但它没有传递它。
在您的情况下,您应该从参数列表中删除res
,这样您就不会隐藏关闭时可用的res
。
app.delete('/todo/:id', function(req, res){
var id = [req.params.id];
couch.view('items', 'all_items', {keys: id}, function(err, body) {
// Don't define a res argument to this callback, use it from the closure
...
res.redirect('/todo');
});
});
你的doStuff
需要进行回调,在你的情况下,你不需要通过它,因为它可以通过闭包获得。
function dostuff(id, cb) {
console.log(id);
// Faking doing something async
setTimeout(cb, 1000);
};
app.post('/:id', function(req, res){
dostuff(req.params.id, function() {
// res is available from the closure
res.redirect('/');
});
});
如果你的回调没有内联定义,这是另一个解决方案。
function dostuff(id, cb) {
console.log(id);
// Faking doing something async
setTimeout(function, 1000);
};
function afterFinished(res) {
res.redirect('/');
}
app.post('/:id', function(req, res){
dostuff(req.params.id, afterFinished.bind(null, res));
});
答案 1 :(得分:0)
您可以将res绑定到回调,如下所示:
dostuff(req.params.id, (function(res) {
res.redirect('/');
}).bind(this, res));