【问题标题】:Cannot listen/handle EventEmitter in callback无法在回调中侦听/处理 EventEmitter
【发布时间】:2012-02-01 06:54:07
【问题描述】:

使用 Mongoose 与 MongoDB 一起工作,但是当尝试处理查询回调中发出的事件(即使用 Formidable 解析分段上传)时,没有运气。知道原因或解决方法吗?

模型

var mongoose = require('mongoose');

function User() {
  return mongoose.model('users', new mongoose.Schema({
    username: String,
    email: String,
    name: String
  }));
}

exports = module.exports = User;

服务器

/** Example HTTP server
  */

var http = require('http'),
    mongoose = require('mongoose'),
    formidable = require('formidable'),
    models = require('./models');

mongoose.connect('mongodb://localhost/test');

var User = new models.User();
var form = new formidable.IncomingForm();

http.createServer(function(request, response) {
  User.findOne({ username: 'wayoutmind' }, function(error, user) {
    // Does not print to console, Event listener blackhole?
    form.on('field', function(name, value) {
      console.log(name + ':' + value);
    });
    form.parse(request);
  });
}).listen(1337);

【问题讨论】:

    标签: javascript node.js mongodb mongoose multipart


    【解决方案1】:

    您能否确认表单解析是独立工作的,即如果您省略了对数据库的调用 (findOne)?

    如果是这样,您可能想尝试设置您的form.on() 回调并在调用User.findOne() 之前运行form.parse() ?表单对象可以在内部监听 "data" 请求事件,这些事件在来自 findOne() 的回调被触发时已经发生。

    您也可以尝试使用 request.pause() 和 request.resume() (hackier):

    http.createServer(function(request, response) {
      request.pause();
      User.findOne({ username: 'wayoutmind' }, function(error, user) {
           form.on('field', function(name, value) {
           console.log(name + ':' + value);
         });
         request.resume();
         form.parse(request);
      });
    }).listen(1337);
    

    【讨论】:

    • 解析独立工作,表单对象显然缺少那些“数据”事件。关于如何在form.on('field')回调中使用User.findOne回调返回的结果的建议?
    • 有很多方法可以解决这个问题,例如,您可以在每次"field" 回调触发时将数据推送到一个数组中,这样您就可以缓冲所有需要处理的数据。然后将一个事件处理程序添加到form.on("end") 并在那里进行处理,您需要的表单中的所有数据都保存在准备使用的数组中。在这里也可以使用 step.js 或 async.js 之类的库容易得多。
    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多