从模块函数node.js返回响应

时间:2014-05-07 13:21:45

标签: javascript node.js express mongoose

我有一个带有路由的app文件和另一个写有mongoose模式和集合模型对象的模块。应用代码是:

app.post("/saveNode", function(req, res) {
    console.log(req.body.clientId)
    if(req.body.hasOwnProperty("clientId")) {
        defferedObject = nodeDbObject.returnCollectionObject(req.body);
    }
}

从路由我调用mongoose model(returnCollectionObject)对象的函数,它将在post调用中获得的body保存到数据库。这个函数写在模块中。代码相同如下:

exports.returnCollectionObject = function(body) {
    var collection = "refresh_hierarchy";
    var nodeModelObject = mongoose.model(collection, folderSchema);
    return nodeModelObject.create(body, function(err, resp) {
        if(err == null) {
            return resp;
        }
    });
};

我从我的邮寄路线中调用此功能。我希望从我的路径中的function(resp)返回的对象,以便我可以在response中使用它的一些字段返回。在.done()上使用defferedObjectreturn resp尝试但未返回任何内容。我做得对吗?这是带有完成功能的代码。

app.post("/saveNode", function(req, res) {
    if(req.body.hasOwnProperty("clientId")) {
        defferedObject = nodeDbObject.returnCollectionObject(req.body);
        defferedObject.done(function(resp) {
            res.send({"data": resp.uniqueNodeId, "error": err});
            res.end();
        });
    }
}

这只是我编写节点服务的第一个难题。任何人都可以帮我解决这个问题。可以这样做吗?我得到的错误如下。

TypeError: Cannot call method 'done' of undefined

1 个答案:

答案 0 :(得分:0)

使用异步调用,返回值将不起作用,您需要使用回调:

exports.returnCollectionObject = function(body, callback) {
    var collection = "refresh_hierarchy";
    var nodeModelObject = mongoose.model(collection, folderSchema);
    nodeModelObject.create(body, function(err, resp) {
         callback(err, resp);  // err might be null or some error, check in caller
    });
};

在您的路线中,请执行以下操作:

var dbObj = require('./nodeDbObject');  // assume you name file
                                        // nodeDbObject.js which
                                        // contains 
                                        // returnCollectionObject()
app.post("/saveNode", function(req, res) {
    if(req.body.hasOwnProperty("clientId")) {

        dbObj.returnCollectionObject(req.body, function(err, result) {
            if (err) {
                res.send({error: err});
            } else {
                res.send({data: result});
            }
        });
    } else {
        res.send({error: "no clientId"});
    }
}