Javascript node.js/socket.io中的对象/方法/变量访问
我相信这是一些范围/变量访问问题,但我不确定,所以我将告诉您整个上下文 我们的想法是有一个node.js“application”,它允许您在HTML前端输入一个数字,该数字通过socket.io发送到服务器,然后通过mongoose保存到mongodb。然后,作为回报,从数据库中获取数字并在客户端脚本中使用它 现实生活中的一个例子是,您可以在客户端输入汽车的里程数/任何内容,然后触发socket.io事件,将此信息传输到node.js服务器,并使用mongoose将其保存到monogodb。这很有效。现在,我还想保留和保存一些首选项。Javascript node.js/socket.io中的对象/方法/变量访问,javascript,node.js,variables,socket.io,Javascript,Node.js,Variables,Socket.io,我相信这是一些范围/变量访问问题,但我不确定,所以我将告诉您整个上下文 我们的想法是有一个node.js“application”,它允许您在HTML前端输入一个数字,该数字通过socket.io发送到服务器,然后通过mongoose保存到mongodb。然后,作为回报,从数据库中获取数字并在客户端脚本中使用它 现实生活中的一个例子是,您可以在客户端输入汽车的里程数/任何内容,然后触发socket.io事件,将此信息传输到node.js服务器,并使用mongoose将其保存到monogodb。这
我有一个
首选项
对象,它保存变量numDigits和一些方法/函数。保存
numDigits
到服务器,从服务器查询条目。但是,将数字保存到
Preferences.numDigits
中不会
client.js
//init.js
//var Preferences;
var Preferences = {
numDigits: 'default',
parse: function(){
this.numDigits = parseInt($('#preferences > #num-digits').val());
},
get: function(){
socket.emit('req-preferences', function(responseData) {
this.numDigits = responseData.numDigits;
console.log('#1: ' + this.numDigits);
});
console.log('#1: ' + this.numDigits);
// 2 different outputs (scopes?) here
},
save: function(){
socket.emit('save-preferences', this);
}
}
var UI = {
numDigits: Preferences.numDigits,
build: function() {
Preferences.get();
console.log(Preferences.numDigits);
for (i=0; i<Preferences.numDigits;i++) {
$('#input-km').append('<input type="text"></input>');
}
}
}
$(document).ready(function() {
socket = io.connect('http://127.0.0.1:8080');
function print(data) {
console.log(data);
if (data.length == 0) {
$('#results').html('no entries!');
} else {
for (i = 0; i < data.length; i++) {
$('#results').append(data[i].date + ' - ' + data[i].km + '<br />');
}
}
}
socket.on('res-entries', function(entries){
print(entries);
});
$('#submit').click(function() {
var kmStand = $('#km').val();
socket.emit('submit', kmStand, function(){
});
});
$('#req-entries').click(function(){
socket.emit('req-entries', function() {
});
});
$('#remove-all').click(function() {
socket.emit('remove-all', function() {
console.log('remove all');
});
});
$('#save-preferences').click(function() {
Preferences.parse();
Preferences.save();
});
//Preferences.get();
UI.build();
});
var http = require('http');
var connect = require('connect');
var io = require('socket.io');
var mongoose = require('mongoose');
var server = http.createServer(connect()
.use(connect.static(__dirname))).listen(8080);
var socket = io.listen(server);
socket.set('log level', 2);
var db = mongoose.createConnection('localhost', 'mileagedb');
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
var entrySchema = new mongoose.Schema({
km: String,
date: {
type:Date,
default:Date.now
}
});
var preferencesSchema = new mongoose.Schema({
numDigits: Number,
objId: Number
});
var Preferences = db.model('Preferences', preferencesSchema);
var Entry = db.model('Entry', entrySchema);
socket.sockets.on('connection', function(socket){
socket.on('submit', function(kmStand){
var eintrag = new Entry({
km: kmStand,
});
eintrag.save(function(err) {
if (err) {
console.log('error while saving');
} else {
console.log('saved');
}
});
Entry.find(function(err, entries) {
console.log('all entries:');
console.log(entries);
});
});
socket.on('req-entries', function() {
Entry.find(function(err, entries) {
socket.emit('res-entries', entries);
});
});
socket.on('remove-all', function() {
Entry.find().remove();
Preferences.find().remove();
});
socket.on('save-preferences', function(prefObj) {
Preferences.update(Preferences.findOne(), {$set: { numDigits: prefObj.numDigits }}, { upsert: true }, function(err){
if (err) {
console.log('error saving');
}
});
Preferences.find(function(err, prefs) {
console.log('all preferences:');
console.log(prefs);
});
});
socket.on('req-preferences', function(fn) {
Preferences.findOne(function(err, prefs) {
fn(prefs);
})
});
});
});
/* maybe:
socket.on('get-entries'), function(requestSpecification) {
...
}*/
客户端上的控制台输出为:
(on body load, UI.build() fires)
#2: default (line 14)
#1: 5 (line 12)
>Preferences.get();
#2: default (line 14)
<-undefined
#1: 5 (line 12)
>Preferences.numDigits
"default"
(主体加载时,UI.build()激发)
#2:默认值(第14行)
#1:5(第12行)
>Preferences.get();
#2:默认值(第14行)
Preferences.numDigits
“默认值”
UI.build()中的for循环也不会启动,因此我将它的值设为“default”。如前所述,我非常确定这是Preferences.get()中的变量/范围问题但是我一个人就是不能理解这个问题。如果你们中有人能在这件事上帮助我,那就太好了
提前多谢
编辑:粘贴了错误的代码我认为您的代码仍然不是生成该输出的代码(即代码中的第12行和第14行都包含#1)。无论如何,这可能不是问题所在
好的,首先,我认为“emit”的第二个参数应该是要发送的数据,只有第三个参数应该是回调函数。但也许这确实有效
然后是范围问题。始终要注意闭包(=回调函数)中的“this”指向什么。最佳解决方案是:
get: function(){
var that = this;
socket.emit('req-preferences', function(responseData) {
that.numDigits = responseData.numDigits;
console.log('#1: ' + that.numDigits);
});
console.log('#1: ' + that.numDigits);
// 2 different outputs (scopes?) here
},
我自己,我总是让任何成员函数的第一行是“var that=this”,然后在整个函数中只引用“that”。如果你真的想了解原因,请检查。另外,在代码中使用“use strict”有助于防止此类问题
我还没试过,但我想这应该会有帮助