1

私は 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);
4

1 に答える 1

2

まず第一に、connectdbは非同期関数であるため、すぐに戻り、後でコールバックを実行します。つまり、 の順序はconsole.log「前」になります。後で!" そして「中!」今度いつか。

とは言っても、connectdb実際には何の役にも立ちません。Mongoose は接続するまでコマンドを自動的にバッファリングするため、同期インターフェイスのように扱うことができます。

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);
于 2012-08-21T03:50:41.503 に答える