我一直在研究这个websocket函数,它调用mongodb返回一些我用' get'存储的数据。
const User = require('mongoose');
const express = require('express');
const cal = require('../../app/models/data.server.model.js');
const d = require('../../app/routes/data.server.routes.js');
const data = require('./data.server.controller');
module.exports = function(app) {
require('express-ws')(app);
app.ws('/', function (ws, req) { //webSocket callback function
ws.on('message', function (msg) {
console.log("Message received from client: %s", msg);
if (msg == "Update" || msg == "update") {
const calendar = app.route('/api/data').get(); //Query mongoose, return events.
console.log(calendar);
ws.send("fromJSON " + JSON.stringify(calendar));
}
});
});
};
此路线使用此功能:
module.exports = function(app) {
app.route('/api/data')
.get(data.list)
.post(users.requiresLogin, data.create);
最后应该致电:
exports.list = function(req, res) {
Data.find().sort('-created').populate('creator', 'firstName lastName fullName').exec((err, datas) => {
if (err) {
return res.status(400).send({
message: getErrorMessage(err)
});
} else {
res.status(200).json(datas);
}
});
};
并返回我的数据。
然而,我所有人都参与了变量'日历'是一个带有'路径的JSON对象(它是相同的路径 - ' api / data'),' stack' &安培; '方法'这是空的。
我知道数据存在,因为我可以使用一些AngularJS代码访问它,但我不太清楚如何在这里访问它。任何帮助将不胜感激,如果我在任何地方有点模糊,请告诉我。提前谢谢!
答案 0 :(得分:2)
问题是您正在尝试使用异步方法,如同步方法。当您发送WS消息时,您实际上还没有数据。
我不确定它是否是调用路由处理程序的最佳选择。我将代码更改为以下内容:
...
// In your model static methods you can do a method that will return data
// You use arrow function, so ES6 is okay. Then you can use Promises
// to avoid callbacks. Mongoose supports Promises by default.
//
getData () {
return this
.find()
.sort('-created')
.populate('creator', 'firstName lastName fullName')
.exec();
}
然后list
方法将如下所示:
exports.list = (req, res) => {
Data
.getData()
.then(data => res.status(200).json(data))
.catch(err => {
res.status(400).send({
message: getErrorMessage(err)
});
})
}
对于WebSockets,您可以从模型中调用方法:
app.ws('/', function (ws, req) { //webSocket callback function
ws.on('message', function (msg) {
console.log("Message received from client: %s", msg);
if (msg == "Update" || msg == "update") {
Data
.getData()
.then(data => {
console.log(data);
ws.send("fromJSON " + JSON.stringify(calendar));
})
.catch(/*Handle errors here*/);
}
});
});
或者您可以直接致电Data.find().sort('-created')...
而不是将其包装到方法中。