Node.js将一个variables等待分配,直到callback函数完成
我正在使用Node.js,Express,MongoDB和Mongoose。 我有一个函数,获取我的MongoDB数据库中的一个文档的最大的身份证号码,并将其返回给程序。 我已经开始模块化我的代码,并已经将该function迁移到另一个模块。 我已经成功地访问了我的主要模块中的function,但它涉及asynchronous数据库查询。 当函数返回一个值,我想把它分配给一个variables。 不幸的是,当返回值被分配给variables时,variables实际上被设置为undefined。 我正在考虑使用事件发射器来表示查询已经完成,但是也提出了两个问题:
1)我不认为你可以做任何事情在一个程序之后,返回声明,这将是必需的。
2)模块之间的事件发射器看起来非常挑剔。
请帮我把variables分配给正确的值。 主要function和模块的代码如下:
(主文件)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; } }); }; };
你需要让findLargestID
接受一个可以调用的callback参数:
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); } }); };
- 如何将variables从app.js传递给routes / index.js?
- 为什么即使webpack不抛出任何错误,React组件不渲染?
- ExpressJS并在单独的路由文件之间传递variables
- 无法使用快速路由和无尾随斜杠来提供静态文件
- setheader给出错误:“抛出新的错误('发送后不能设置标题');”
- NodeJS + Redis + Express + Passport Facebook身份validation失败
- router.use中间件链不按预期工作?
- npm“错误networkinggetaddrinfo ENOTFOUND”
- 一个单元如何testingExpress的路线?