2017-01-03 57 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對象,這似乎是個竅門。 –