请告诉我,我如何使用客户端上的骨干应用程序和服务器端的nodejs + mongodb创建REST API。
我是nodejs的新手,无法理解所有基本的东西。
仅举例 - 我需要收集朋友。 在我的客户端应用程序中,我说
var collection = new Backbone.Collection.exted({
model: model,
url: '/api/friends'
});
collection.fetch();
好的,在服务器上(nodejs + express)我可以收听这个请求 app.get('/ api / friends',friends.get);
在«朋友»模块中我有«获取»功能。它连接到数据库,尝试从«friends»集合中获取数据(如果集合不存在则必须创建)。如果collection为空,则函数必须初始化对vk.com(社交网络)服务器的请求以获取其数据。
/*
* GET friends
*/
var https = require('https'),
Db = require('mongodb').Db,
Server = require('mongodb').Server;
var client = new Db('data', new Server('127.0.0.1', 27017, {})),
friends;
function getAllFriends(err, collection) {
if (!collection.stats()) {
https.get('https://api.vk.com/method/friends.get?access_token=' + global['access_token'], function (d) {
var chunk = '',
response;
d.on('data', function (data) {
chunk += data;
});
d.on('end', function () {
response = JSON.parse(chunk).response;
response.forEach(function (friend) {
collection.insert(friend, function (err, docs) {
if (err) console.log(err);
});
});
}).on('error', function (e) {
console.error(e);
});
});
}
friends = collection.find({}, {
limit: 1000
}).toArray(function (err, docs) {
return docs;
});
}
exports.get = function (req, res) {
client.open(function (err, pClient) {
client.collection('friends', getAllFriends);
res.send(friends);
});
};
但是这段代码不起作用。我不明白为什么。
/node_modules/mongodb/lib/mongodb/connection/server.js:524
throw err;
^
TypeError: Cannot read property 'noReturn' of undefined
at Cursor.nextObject.commandHandler (/node_modules/mongodb/lib/mongodb/cursor.js:623:17)
at Db._executeQueryCommand (/node_modules/mongodb/lib/mongodb/db.js:1702:5)
at g (events.js:192:14)
at EventEmitter.emit (events.js:126:20)
at Server.Base._callHandler (/node_modules/mongodb/lib/mongodb/connection/base.js:130:25)
at Server.connect.connectionPool.on.server._serverState (/node_modules/mongodb/lib/mongodb/connection/server.js:517:20)
at MongoReply.parseBody (/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:127:5)
at Server.connect.connectionPool.on.server._serverState (/node_modules/mongodb/lib/mongodb/connection/server.js:476:22)
at EventEmitter.emit (events.js:96:17)
at _connect (/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:175:13)
也许这段代码在需要时不会创建集合?
也许我做错了什么,所以你能给我一个很好的链接来阅读nodejs或mongo中的教程。
感谢您的建议,对不起我的英语。
答案 0 :(得分:2)
有很多代码在这里不起作用。以此为例:
if (!collection.stats()) {
fetchFriends().forEach(function (friend) {
collection.insert(friend, function (err, docs) {
if (err) console.log(err);
});
});
}
friends = collection.find({}, {
limit: 1000
}).toArray(function (err, docs) {
return docs;
});
}
首先,你不能像fetchFriends那样做。该函数不返回任何内容,所有工作都在异步回调中完成。
其次,如果它是空的,你仍然会触发直接查找的电话,而不是等到插入结果完成。
即使是调用链的开头也被打破了:
exports.get = function (req, res) {
client.open(function (err, pClient) {
client.collection('friends', getAllFriends);
res.send(friends);
});
};
您不能在致电res.send
后致电client.colleciton
,在getAllFriends完成工作后,您需要在回调中执行此操作。
在你正在做的事情中,人们普遍缺乏对异步代码的理解,我认为现在不用担心节点/ mongo教程,而是首先更多地使用节点,并查看异步库并承诺直到你对异步感到满意。
答案 1 :(得分:1)
我不知道这段代码应该做什么。
你可能会首先发现:
exports.get = function (req, res) {
client.open(function (err, pClient) {
client.collection('friends', getAllFriends);
res.send(friends);
});
};
不起作用,因为变量“friends”不是你所期望的那样。