如何在nodejs中使用mongodb从回调函数内部发送消息

时间:2014-11-17 00:49:28

标签: node.js mongodb

我正在编写一个基本的项目经理,没什么特别的。我正在编写创建项目的页面(使用AngularJS)并将所有$ scope发送到/ create(后端是Express.js)。路由器完美地获取JSON,并将其保存到本地MongoDB而没有任何问题。

我的问题是我想设置一条消息,告诉项目已成功创建并将其发送回AngularJS。这是我的代码。

router.js

module.exports = function(app, db) {
   app.post('/create', function (req, res) {
      var create = require("./../scripts/create")(req, res, db);
      console.log(create);  //just for testing whether I can receive the message.
   });
}

create.js

module.exports = function(req, res, db) {
   db.collection('projects').insert(req.body.project, function(err, docs) {
      if (err) throw err;

      return 'Project created.';   //I want to return this string.
   });
};

我不知道如何从db.collection.insert的回调函数中返回一些内容。

2 个答案:

答案 0 :(得分:1)

所以你必须记住,JavaScript中的匿名函数调用没有分配到任何地方。他们通过,然后丢失。这通常是我们在其中没有真正返回陈述的原因。

var x = function () { return y };x y的值,但由于永远不会分配回调值,因此返回语句毫无意义。回调,无论它们是否有返回值,都不会给你一个值。他们可能会将该返回值提供给他们给予的函数,但它们完全会丢失给您。

解决这个问题的方法是对范围做一些诡计。基本上你想要做的是' bump'您想要返回的值,您可以指定一个范围,然后将其返回。例如,您可以这样做:

module.exports = function(req, res, db) {
    var stringToReturn;
    db.collection('projects').insert(req.body.project, function(err, docs) {
        if (err) throw err;

        stringToReturn = 'Project created.';   //I want to return this string.
   });
   return stringToReturn;
};

这将起作用,因为返回值绑定到module.exports,而module.exports又绑定到

的结果
var create = require('./create');
console.log(create('something'))      //should log 'Project created.'

答案 1 :(得分:1)

解决!!

<强> Router.js

module.exports = function(app, db) {
    app.post('/create', function(req, res) {
        var create = require("./../scripts/create")(req, res, db);
    });
});

<强> Create.js

module.exports = function(req, res, db) {
    db.collection('projects').insert(req.body.project, function(err, records) {
        if (err) throw err;

        res.send("Project created.");
    });
};

现在Angular正在接收来自服务器的响应。