2017-01-03 37 views
0

我正在使用Ajax调用自己调用AWS的NodeJS/ExpressJS post方法,并且我希望将AWS返回状态返回给浏览器。毫不奇怪,在下面片段末尾的“res.status(200).send('Success!');”在AWS本身甚至被调用之前调用,因此没有意义。但无法弄清楚如何在AWS的匿名返回函数中获取原始Ajax“res”对象,因此我可以调用.status和.send。看起来很简单,但一直没有弄清楚。如何从Node.JS/Express.JS post()方法返回AWS错误状态?

router.post('/notification', function(req, res) { 
    var config = req.app.get('config'); 
    var sns = new AWS.SNS({ region: config.AWS_REGION}); 
    var snsMessage = 'Hello world!'; 
    sns.publish({ TopicArn: config.NEW_SIGNUP_TOPIC, 
        Message: snsMessage }, function(err, data) { 
     if (err) { 
      console.log('Error publishing SNS message: ' + err); 
     } else { 
      // How to get the original res object here, so I can call 
      // res.status(200).send('It worked!') here 
      console.log('It worked!'); 
     } 
    }); 
    // The following line returns status to the original ajax post call 
    // before AWS is even called. 
    res.status(200).send('Success!'); // 
}); 

回答

1

你就不能移动该行代码步入回调?事情是这样的:

router.post('/notification', function(req, res) { 
    var config = req.app.get('config'); 
    var sns = new AWS.SNS({ region: config.AWS_REGION}); 
    var snsMessage = 'Hello world!'; 
    sns.publish({ TopicArn: config.NEW_SIGNUP_TOPIC, 
        Message: snsMessage }, function(err, data) { 
     if (err) { 
      console.log('Error publishing SNS message: ' + err); 

      res.status(500).send('Error!'); 
     } else { 
      // How to get the original res object here, so I can call 
      // res.status(200).send('It worked!') here 
      console.log('It worked!'); 

      res.status(200).send('Success!'); 
     } 
    }); 
}); 
+0

是的,工作!谁知道!令我惊讶的是,“res”的范围可能扩展到稍后执行的匿名回调函数,但我猜JavaScript理解它正在调用方法中访问一个对象并使其工作。非常感谢! –

+0

为了好玩,我只是尝试在router.post()中创建一个局部变量foo,并且正如我期望的那样,在尝试访问回调中的foo时出现错误。我想我在指望原始请求对象没有去任何地方的事实,因此回调仍然可以得到它?思考? –

+0

你应该阅读JavaScript范围。如果您有新问题,请展示您的新代码。或者将其作为一个新问题提出。 –

0

路线中间件需要,可用于错误传递给应用全局错误处理程序的第三个可选参数next

router.post('/notification', function(req, res, next) { 
... 
    if (err) { 
     console.log('Error publishing SNS message: ' + err); 
     next(err); 
    } else { 
     // How to get the original res object here, so I can call 
     // res.status(200).send('It worked!') here 
     console.log('It worked!'); 
     res.status(200).send('Success!'); 
    } 
... 
+0

感谢您的回复。事实上,你似乎可以直接从回调中访问res对象,这似乎是个窍门。 –