我正在编写一个基本的项目经理,没什么特别的。我正在编写创建项目的页面(使用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的回调函数中返回一些内容。
答案 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正在接收来自服务器的响应。