在回调函数中导出模块?

时间:2014-04-29 00:53:46

标签: node.js express module sequelize.js

有没有办法导出一些回调函数内的变量?例如,如果我需要在另一个文件中使用room.room_id,我该怎么办?我试过module.exports.roomId = room.room_id但是另一个文件中的roomId似乎是undefined.thanks!

var Room = require('../models/database').Room

exports.create = function (req, res) {


Room
    .create({
        room_name: req.body.roomName
    })
    .complete(function () {

        Room
            .find({where: {room_name: req.body.roomName}})
            .success(function (room) {

                // if(err) console.log(err);

                res.redirect('rooms/videochat/' + req.body.roomName + '/' + room.room_id);
                console.log("room_id: " + room.room_id);

                module.exports.roomId = room.room_id;
        })

    })

};

2 个答案:

答案 0 :(得分:1)

你不能那样做,因为模块是同步评估的,并且你将来某个时间你会变异module.exports。您需要做的是提供回调并传递值或使用回调作为您可以成功读取导出属性的指示符。

答案 1 :(得分:0)

这不是解决此问题的最佳方法,因为模块会同步读取并缓存,但您的代码似乎处理请求和响应。

你需要输出这样的东西:

var rooms = {};

exports.create = function (req, res, next) {
  Room.create({
    room_name: req.body.roomName
  }).complete(function () {
    Room.find({where: {room_name: req.body.roomName}})
      .success(function (room) {
        res.redirect('rooms/videochat/' + req.body.roomName + '/' + room.room_id);
        rooms[req.body.roomName] = room.room_id;
      });
  });
};

exports.rooms = rooms;

如果您使用的是Express.js,您可以在其他地方注册这样的路线:

var roomsManager = require('./path/to/the/module');

//handle the create room endpoint
app.post('/room', roomsManager.create);

//get the room_id given a room name:
console.log('the room id of "some room" is:', roomsManager.rooms["some room"]);