【问题标题】:Node.js Making a Variable Wait to be Assigned Until Callback Function is DoneNode.js 让变量等待分配,直到回调函数完成
【发布时间】:2012-08-28 15:16:06
【问题描述】:

我正在使用 Node.js、Express、MongoDB 和 Mongoose。我有一个函数可以获取我的 MongoDB 数据库中文档的最大 ID 号并将其返回给程序。我已经开始模块化我的代码,并将该功能迁移到另一个模块。我已经成功访问​​了主模块中的函数,但它涉及到异步数据库查询。当函数返回一个值时,我想将它分配给一个变量。不幸的是,当将返回值赋给变量时,变量实际上被设置为未定义。我正在考虑使用事件发射器来表示查询已完成,但这也带来了两个问题:

1) 我不认为您可以在程序中在 return 语句之后执行任何操作,这将是必需的。

2) 模块之间的事件发射器看起来非常挑剔。

请帮助我将变量分配给正确的值。主要功能和模块的代码如下:

(主文件)app.js:

//requires and start up app
var express = require('express');
var mongoose = require('mongoose')
  , dbURI = 'localhost/test';
var app = express();
var postmodel = require('./models/post').postmodel;

//configures app for general stuff needed such as bodyParser and static file directory
app.configure(function () {
    app.use(express.bodyParser());
    app.use(express.static(__dirname + '/static'));
});

//configures app for production, connects to mongoLab databse rather than localhost
app.configure('production', function () {
    dbURI = 'mongodb://brad.ross.35:lockirlornie@ds037387.mongolab.com:37387/heroku_app6901832';
});

//tries to connect to database.
mongoose.connect(dbURI);
//once connection to database is open, then rest of app runs
mongoose.connection.on('open', function () {
    var PostModel = new postmodel();
    var Post = PostModel.setupPostSchema();
    var largest_id = PostModel.findLargestID(Post);

(模块)post.js:

var mongoose = require('mongoose');

module.exports.postmodel = function () {
    this.setupPostSchema = function () {
        var postSchema = new mongoose.Schema({
                title: String,
                body: String,
                id: Number,
                date_created: String
            });

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

    this.findLargestID = function (Post) {
        Post.find(function (err, posts) {
            if (err) {
                console.log("error finding largest ID!");
            } else {
                var largest_id = 0;
                for (var post in posts) {
                    if (posts[post].id >= largest_id) largest_id = posts[post].id;
                }
                console.log(largest_id);
                return largest_id;
            }
        });
    };
};

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    您需要让findLargestID 接受一个回调参数,一旦largest_id 可用,它将调用该参数:

    this.findLargestID = function (Post, callback) {
        Post.find(function (err, posts) {
            if (err) {
                console.log("error finding largest ID!");
                callback(err);
            } else {
                var largest_id = 0;
                for (var post in posts) {
                    if (posts[post].id >= largest_id) largest_id = posts[post].id;
                }
                console.log(largest_id);
                callback(null, largest_id);
            }
        });
    };
    

    【讨论】:

    • 只是为了学习,为什么你有 null 作为第一个参数?
    • 节点约定是回调的第一个参数总是指示是否有错误。请参阅 if (err) 块中的 callback(err); 语句。
    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 2016-02-17
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多