Node.js Express 和 Mongoose,在 save() 之后渲染

Posted

技术标签:

【中文标题】Node.js Express 和 Mongoose,在 save() 之后渲染【英文标题】:Node.js Express and Mongoose, rendering after a 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() 继续发送信息,连接何时关闭? 看这里***.com/questions/27423777/… 【参考方案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 方法的回调。

以上是关于Node.js Express 和 Mongoose,在 save() 之后渲染的主要内容,如果未能解决你的问题,请参考以下文章

UnhandledPromiseRejectionWarning、Express.js 和 Node.js

开源 Node.js(和 Express)项目 [关闭]

使用 Node.js 和 Express 发布时如何访问请求正文?

Express 和 node.js 中的 HTML?

使用 node.js 和 express 的 JQuery Ajax 发布请求

Node.JS、Express 和 MongoDB :: 多个集合