【问题标题】:Node.js Express and Mongoose, rendering after a save()Node.js Express 和 Mongoose,在 save() 之后渲染
【发布时间】:2012-11-29 12:37:50
【问题描述】:

我刚开始通过创建一个简单的博客网站来试验 Node.js Express 和 Mongoose。

我正在尝试构建一些路由来执行一些简单的数据库操作,但我对异步函数以及我的代码是否每次都能正确执行感到困惑。

这基本上就是我所拥有的:

app.get('/createUser', function(req, resp) {
    var newUser = new User({name: 'abc123', pass: 'password321'});
    newUser.save(function(err){ // will this callback always be called correctly?
        if(err) resp.send('ERROR!');
        resp.send('SUCCESS!');
    });
});

所以我希望将响应写为“错误!”对于保存中的任何错误,以及“成功!”保存成功时。但是,我对这些功能的时间安排感到困惑。 get() 函数会在 save() 完成之前返回吗?如果是这样,响应会不会被正确写出?

【问题讨论】:

  • 是的,它会一直触发。别介意我的旧评论。您的回调将始终触发。
  • 这样做是为了避免继续执行到下一行if(err) return resp.send('ERROR!');
  • 如果 resp.send() 继续发送信息,连接何时关闭?

标签: javascript node.js asynchronous express mongoose


【解决方案1】:

get() 函数将在保存函数之前完成,但由于在执行保存回调之前没有任何内容写入响应,因此在此之前浏览器将无法获得响应.

我在您的代码中添加了一些 console.log() 调用,以便您查看执行顺序:

app.get('/createUser', function(req, resp) {

    console.log('this will print first');

    var newUser = new User({name: 'abc123', pass: 'password321'});
    newUser.save(function(err){ // will this callback always be called correctly?

        console.log('this will print last');

        if(err) {
            resp.send('ERROR!');
        }
        else {
            resp.send('SUCCESS!');
        }
    });

    console.log('this will print second');

});

【讨论】:

  • 所以浏览器正在等待第一个 resp.send() 渲染任何东西?
  • 是的,浏览器会一直等到收到响应。但请记住,Node 不会被搁置。 Node 将返回事件循环并处理接下来发生的任何事情(例如另一个请求),并最终处理来自 save 方法的回调。
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 2018-05-02
  • 1970-01-01
  • 2015-09-12
  • 2013-12-04
  • 2016-12-28
  • 2017-10-24
  • 2017-09-11
相关资源
最近更新 更多