我正在尝试将Socket.io与Angular集成,并且我很难从客户端到服务器建立连接.我查看了其他相关问题,但我的问题是在本地发生的,所以中间没有Web服务器.
这就是我的服务器代码:
const app = express();
const server = http.createServer(app);
const io = require('socket.io').listen(server);
io.on('connection', function(socket) {
socket.emit('greet', { hello: 'Hey, Mr.Client!' });
socket.on('respond', function(data) {
console.log(data);
});
socket.on('disconnect', function() {
console.log('Socket disconnected');
});
});
Run Code Online (Sandbox Code Playgroud)
我按以下顺序使用Grunt加载客户端JavaScript文件:
dist: {
src: [
public/bower_components/angular/angular.min.js,
...
public/bower_components/socket.io-client/dist/socket.io.min.js,
public/bower_components/angular-socket-io/socket.min.js,
...
]
}
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器中:
function MyController($scope) {
let socket = io.connect(window.location.href);
socket.connect('http://localhost:3000');
socket.on('greet', function(data) {
console.log(data);
socket.emit('respond', { message: 'Hello to you too, Mr.Server!' });
});
...
}
Run Code Online (Sandbox Code Playgroud)
在实际使用btford/angular-socket-io库之前,我想确保我可以正确获得连接,但是在控制台中出现以下错误:
有趣的是,如果我重新启动Node.js服务器进程,它确实设法发送消息,但使用轮询而不是websockets.
我在socket.connect调用中尝试了各种不同的选项,但没有任何效果.
任何帮助,将不胜感激.
我刚刚意识到websockets部分工作.我在Chrome开发者控制台中看到了101切换协议请求.但是我看到的唯一框架是engine.io协议包(ping,pong).但是我的应用程序套接字消息仍然由于某种原因而退回到轮询...
我正在编写一个需要在两个表之间进行$ lookup的查询,据我所知,对ForeignField拥有索引以便及时执行此连接至关重要。但是,即使在字段上添加了索引之后,查询仍然会回退到COLLSCAN。
db.users.aggregate([
{$lookup:{ from: "transactions", localField: '_id', foreignField: 'uid', as: 'transaction' }},
{ $match: { transaction: { "$size" : 0} } },
{ $count: "total"},
], { explain: true })
Run Code Online (Sandbox Code Playgroud)
返回:
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.users",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
Run Code Online (Sandbox Code Playgroud)
如前所述,我确实在事务集合中索引了uid字段:
> db.transactions.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
}, …Run Code Online (Sandbox Code Playgroud) 我有一个使用几个组的 MongoDB 聚合操作:
{ $group: { "_id": { "vid": "$visitor_id", "pid":"$project.id" } } }
{ $group: { "_id": "$_id.vid", "count": { $sum: 1} } }
Run Code Online (Sandbox Code Playgroud)
返回以下数据:
{
"results": [
{
"_id": "user1",
"count": 1
},
{
"_id": "user2",
"count": 2
},
{
"_id": "user3",
"count": 1
}
]
}
Run Code Online (Sandbox Code Playgroud)
我如何才能返回具有 1 个以上项目(count字段)的用户总数。在这种情况下,它将类似于:
{
total: 1
}
Run Code Online (Sandbox Code Playgroud)
因为只有user21 个以上的项目(count> 1)。
我尝试添加以下组操作无济于事:
{
$group: {
"_id": null,
count: {
$sum: {$cond: [{$gt: ['$_id.count', 1]}, 1, 0]} …Run Code Online (Sandbox Code Playgroud) mongodb mongodb-query aggregation-framework node-mongodb-native
我试图在MongoDB聚合管道的$ group阶段有条件地将字段推入数组.
基本上我有包含用户名的文档,以及他们执行的操作数组.
如果我将用户操作分组如下:
{ $group: { _id: { "name": "$user.name" }, "actions": { $push: $action"} } }
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
[{
"_id": {
"name": "Bob"
},
"actions": ["add", "wait", "subtract"]
}, {
"_id": {
"name": "Susan"
},
"actions": ["add"]
}, {
"_id": {
"name": "Susan"
},
"actions": ["add, subtract"]
}]
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在的想法是将actions数组组合在一起,以查看哪组用户操作最受欢迎.问题是我需要在考虑组之前删除"等待"操作.因此,结果应该是这样的,考虑到在分组中不应该考虑"wait"元素:
[{
"_id": ["add"],
"total": 1
}, {
"_id": ["add", "subtract"],
"total": 2
}]
Run Code Online (Sandbox Code Playgroud)
如果我添加这个$ group阶段:
{ $group : { _id : "$actions", total: { $sum: 1} }} …Run Code Online (Sandbox Code Playgroud)