【问题标题】:How to return AWS error status from a Node.JS / Express.JS post() method?如何从 Node.JS / Express.JS post() 方法返回 AWS 错误状态?
【发布时间】:2017-05-17 00:53:13
【问题描述】:

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

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!');  // 
});

【问题讨论】:

    标签: node.js amazon-web-services


    【解决方案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!');
            }
        });
    });
    

    【讨论】:

    • 是的,成功了!谁知道!我很惊讶“res”的范围可以扩展到稍后执行的匿名回调函数,但我猜 Javascript 理解它正在访问调用方法中的对象并使其工作。非常感谢!
    • 为了好玩,我只是尝试在 router.post() 中创建一个局部变量 foo,正如预期的那样,在回调中尝试访问 foo 时出现错误。我想我指望原始请求对象没有去任何地方,因此回调仍然可以到达它?想法?
    • 您应该阅读 javascript 作用域。如果您有新问题,请显示您的新代码。或者作为一个新问题提出。
    • 从您的回复中,我猜测响应对象具有全局范围,因此它仍然可用的原因。现在一切就绪。再次感谢!
    • 它不是全局的,它只是在范围内。我不确定您是如何从我的回复中得知它是全球性的。你说你运行了一个没有用的测试,但在我看来它应该有效,所以就像我说的,如果你需要更多关于该测试的帮助或其他你需要显示确切代码的东西。我认为,当您需要花时间阅读 JavaScript 作用域的工作原理时,您是基于您对变量作用域在不同编程语言中如何工作的了解对 JavaScript 作用域做出假设。我真的不知道如何将关于 JS 范围的教程浓缩成这个网站上的答案。
    【解决方案2】:

    路由中间件采用可选的第三个参数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!');
        }
    ...
    

    【讨论】:

    • 感谢您的回复。实际上,您似乎可以直接从回调中访问 res 对象,这似乎可以解决问题。
    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2018-05-21
    • 2018-03-10
    • 2016-09-12
    • 2012-01-02
    • 2021-05-30
    相关资源
    最近更新 更多