【发布时间】:2016-04-27 03:17:11
【问题描述】:
我有 2 台相互通信的服务器。当用户想要检查传感器的健康状况时,它会点击 API /check/health,然后与监控服务器对话以获取传感器的状态字段。此状态被发送回 Provisioning 并发送给用户。
我对此进行了测试,它运行良好..即当我执行http://localhost:3000/check/health/4(3 是传感器 ID)时,我得到的响应为 Good。当我执行另一个请求时说http://localhost:3000/check/health/3,我在配置服务器上收到如下错误:
有谁知道为什么我不能做第二个 GET 请求。我似乎让它只适用于第一次健康检查而不是后续健康检查。
输出/错误:
服务器监听 3000 端口
已连接到监控服务器!
服务器获得了传感器 ID 的运行状况检查:4
传感器状态:良好
服务器获得了传感器 ID 的运行状况检查:3
传感器的状态是:未定义
_http_outgoing.js:344
throw new Error('Can\'t set headers after they are sent.');
^
错误:发送后无法设置标头。
在 ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
供应服务器:
// Code to communicate with Monitoring server
var io = require('socket.io-client');
var socket = io.connect('http://localhost:4000', { reconnect: true });
socket.on('connect', function(socket) {
console.log('Connected to Monitoring Server!');
});
// Code to serve the Sensor users
var express = require('express');
var app= express();
var path = require('path');
var bodyParser= require('body-parser');
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/sensor_db');
var Schema = mongoose.Schema;
var sensorSchema = new Schema({
value:{ type:Number, default:0},
format:{type:String, default:"default"},
id:{type:Number,required:true,unique:true},
description:{type:String},
type:{type:String},
groupId:{type:Number},
users:{type:Array,default:[]},
admin:{type:String,default:'Undefined'},
status:{type:String,default:'InActive'},
owner:{type:String,default:'Undefined'},
templateId:{type:Number}
});
var Sensor = mongoose.model('Sensor',sensorSchema);
// API to get the health of the Sensor by looking up its Status, pass the Sensor ID to check
app.get('/check/health/:id', function (req, res) {
var id = req.params.id;
console.log("Server got a health check for Sensor ID :", id);
socket.emit('eventToClient',{ id: id })
socket.on('reply', function (data) {
console.log("The Status of the Sensor is :",data.status);
res.json(data.status);
});
})
app.listen(3000);
console.log('Server listening at port 3000');
监控服务器:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var express = require('express');
var mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/sensor_db') ;
var Schema = mongoose.Schema;
var sensorSchema = new Schema({
value:{ type:Number, default:0},
format:{type:String, default:"default"},
id:{type:Number,required:true,unique:true},
description:{type:String},
type:{type:String},
groupId:{type:Number},
users:{type:Array,default:[]},
admin:{type:String,default:'Undefined'},
status:{type:String,default:'Undefined'},
owner:{type:String,default:'Undefined'},
templateId:{type:Number}
});
var Sensor = mongoose.model('Sensor',sensorSchema);
io.on('connection', function(socket){
console.log('connection received from Provisioning');
// To get messages from Provisioning server
socket.on('eventToClient',function(data) {
var id = data.id
Sensor.findOne({id: id}, function (err, doc) {
if (err) return res.status(500).send({error: err});
socket.emit('reply',doc)
})
});
});
server.listen(4000, function(){
console.log('socket.io server listening on *:4000');
});
【问题讨论】:
-
你每次都面临同样的错误吗?
-
是的,我每次都看到
-
在监控服务器中,你能解释一下你从哪里得到
resinif (err) return res.status(500).send({error: err});吗? -
感谢您发现,这是一个错误,但我猜这个问题不是这样?
标签: javascript node.js websocket socket.io