Javascript 通过express only返回路径请求mongo数据库
我一直在研究这个websocket函数,它调用mongodb来返回我用“get”存储的一些数据Javascript 通过express only返回路径请求mongo数据库,javascript,angularjs,mongodb,express,Javascript,Angularjs,Mongodb,Express,我一直在研究这个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 dat
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);
}
});
};
并返回我的数据
然而,我在变量“calendar”中得到的只是一个JSON对象,其“path”(与“api/data”路径相同)、“stack”和“methods”为空
我知道数据在那里,因为我可以用一些AngularJS代码访问它,但我不太确定如何在这里访问它。任何帮助都将不胜感激,如果我在任何地方有点含糊,请告诉我。提前谢谢 问题在于,您试图像使用同步方法一样使用异步方法。当您发送WS-message时,实际上还没有数据 我不确定这是否是呼叫路由处理程序的最佳选择。我会把代码改成这样:
...
// 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();
}
exports.list = (req, res) => {
Data
.getData()
.then(data => res.status(200).json(data))
.catch(err => {
res.status(400).send({
message: getErrorMessage(err)
});
})
}
然后list
方法将如下所示:
...
// 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();
}
exports.list = (req, res) => {
Data
.getData()
.then(data => res.status(200).json(data))
.catch(err => {
res.status(400).send({
message: getErrorMessage(err)
});
})
}
对于WebSocket,您可以从模型中调用方法:
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')…
,而不将其封装到方法中。问题在于,您试图像同步方法一样使用异步方法。当您发送WS-message时,实际上还没有数据
我不确定这是否是呼叫路由处理程序的最佳选择。我会把代码改成这样:
...
// 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();
}
exports.list = (req, res) => {
Data
.getData()
.then(data => res.status(200).json(data))
.catch(err => {
res.status(400).send({
message: getErrorMessage(err)
});
})
}
然后list
方法将如下所示:
...
// 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();
}
exports.list = (req, res) => {
Data
.getData()
.then(data => res.status(200).json(data))
.catch(err => {
res.status(400).send({
message: getErrorMessage(err)
});
})
}
对于WebSocket,您可以从模型中调用方法:
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')…
,而不将其封装到方法中。我假设它应该是websocket文件中的Data.list()?感谢这一点,它将我推向了正确的方向,但我得到了“this.find()不存在”数据——这是您的模型。并且列表
方法应该在控制器中。您应该将getData
添加到。然后将存在this.find
。我假设它应该是websocket文件中的Data.list()?感谢这一点,它将我推向了正确的方向,但我得到了“this.find()不存在”数据——这是您的模型。并且列表
方法应该在控制器中。您应该将getData
添加到。然后,this.find
将存在。