当我尝试从 Mongoose 访问 MongoDB 数据库时,Node.js Express 应用程序卡住

标签 node.js mongodb express mongoose

我是 Mongoose 的新手,我正在尝试制作一个涉及使用 Mongoose 的简单测试应用程序,以便熟悉它。我可以很好地加载“/”页面,但是当我提交表单时,它会保留在“/”页面上,直到我终止进程。 console.logs“之前”和“之后”打印,但期间从不打印。怎么了?

var express = require('express');
var mongoose = require('mongoose')
  , db = mongoose.createConnection('localhost', 'testmongoose');

var connectdb = function(execute) {
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function () {
        execute();
    });
};

connectdb(function () {
    var postSchema = new mongoose.Schema({
        body: String
    });

    var Post = db.model('Post', postSchema);
});

var app = express();

app.configure(function () {
    //app.use(express.logger());
    app.use(express.bodyParser());
    app.use(express.static(__dirname + '/static'));
});

app.set('views', __dirname + '/views');
app.set('view engine','jade');

app.get('/', function(request, response) {
    response.render('index');
});

app.post('/result', function(request, response) {
    var text = request.body.text;
    console.log("before!");
    connectdb(function () {
        console.log("during!");
        var post = "test";
        post = new Post({body: text});
        response.render('result', {text: post.body});
    });
    console.log("after!");
});

app.listen(4000);

最佳答案

首先,由于 connectdb 是一个异步函数,因此它会立即返回并稍后运行其回调 - 这意味着您的 console.log 的顺序将是“之前!”然后!”然后“期间!”稍后。

也就是说,connectdb 并没有真正为您提供任何用处。 Mongoose 会自动缓冲命令直至连接,因此您可以将其视为同步接口(interface):

var express = require('express');
var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost', 'testmongoose');
mongoose.connection.on('error', console.error.bind(console, 'connection error:'));

var postSchema = new mongoose.Schema({
    body: String
});

var Post = mongoose.model('Post', postSchema);

var app = express();

app.configure(function () {
    //app.use(express.logger());
    app.use(express.bodyParser());
    app.use(express.static(__dirname + '/static'));
});

app.set('views', __dirname + '/views');
app.set('view engine','jade');

app.get('/', function(request, response) {
    response.render('index');
});

app.post('/result', function(request, response) {
    var text = request.body.text;
    var post = new Post({body: text});
    response.render('result', {text: post.body});
});

app.listen(4000);

关于当我尝试从 Mongoose 访问 MongoDB 数据库时,Node.js Express 应用程序卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12047838/

相关文章:

node.js - 按字母顺序对数据进行排序并使用 Expressjs 和 MongoDB 传递到 View

node.js - 当 create-react-app 在终端中没有响应时如何解决

node.js - 从 Node.js 写入文件以避免瓶颈的正确方法是什么?

java - 条件插入 Mongodb

mongodb 全文搜索和 json 对象

javascript - MongoDB lte 不起作用

javascript - Gatsby 开发命令运行但 gatsby 构建出现错误

javascript - 从 Node.js 中的 Json 对象下载文件

javascript - MongoDB JavaScript 查询;过滤列数组中的值

node.js - 嵌套循环续写 Node.js 中的每条记录