【问题标题】:exporting a module in a callback function?在回调函数中导出模块?
【发布时间】:2014-04-29 20:17:10
【问题描述】:

有没有办法导出回调函数中的一些变量?例如,如果我需要在另一个文件中使用 room.room_id,我应该怎么做?我尝试了 module.exports.roomId = room.room_id 但另一个文件中的 roomId 似乎未定义。谢谢!

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;
        })

    })

};

【问题讨论】:

    标签: node.js express module sequelize.js


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。提供回调是什么意思?回调函数应该放在哪里?
    • 你可以做一些类似exports.getRoomId = function(cb) { /* do async calls and call cb(null, room.room_id); or cb(error); on error*/ };的事情然后在你的脚本中需要()'ing这个模块,传入回调:require('./foo').getRoomId(function(err, roomId) { ... });
    • 我想我明白你的解释了。但我现有的代码已经在导出中。我刚刚编辑了我的问题。
    【解决方案2】:

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

    你宁愿导出这样的东西:

    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"]);
    

    【讨论】:

    • 谢谢,但我想导出 room.room_id 以便在其他文件中使用它。我该怎么做?
    • 我想你想保留一个房间名称 -> 房间 ID 的哈希图。看看我编辑的答案。
    • 谢谢。我的不好,我没有提到 room_id 在我的数据库中是 auto_increment。所以像这样使用 hashmap 是多余的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多